Форум программистов, компьютерный форум CyberForum.ru

Удалить каждое четное слово из строки - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 39, средняя оценка - 4.85
BorAl
0 / 0 / 0
Регистрация: 09.12.2010
Сообщений: 22
16.12.2011, 23:52     Удалить каждое четное слово из строки #1
Задача: Удалить каждое четное слово из строки. Это то что надо получить в конце, но т.к. я пытаюсь разобраться, хотелось бы по подробнее шаги рассмотреть!
Идею задачи я понимаю. Но сразу же столкнулся с проблемой написания кода...(подсчет количества слов в введенной строке)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <cstring>
#include <Windows.h>
 
using namespace std;
 
void main()
{
    char str[80];
    int n;
 
    for(int i=0; i < strlen(str); i++)
    {
        if (str[i]==' ') 
            {
                n++;
            }
        n++;
    }
    
    cout<<"Enter text\n";
    cin.getline(str, 80);
    cout<<"Text\n";
    cout<<str<<endl;
 
    cout<<"Kolvo slov = "<<n;
    cout<<endl;
}
В ходе компиляции выводится warning C4018: <: несоответствие типов со знаком и без знака
( i < strlen(str)) вот в этом месте. НЕ могли бы объяснить в чем моя ошибка!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.12.2011, 23:52     Удалить каждое четное слово из строки
Посмотрите здесь:

C++ Удалить из текста каждое четное предложение.
C++ удалить каждое четное слово во введенной строке
Удалить каждое четное слово из строки C++
Найти количество простых чисел в массиве. Перевернуть все нечетные строки матрицы. Перевернуть каждое четное слово в строке C++
В тексте удалить каждое четное слово, продублировать каждое нечетное слово C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
17.12.2011, 00:00     Удалить каждое четное слово из строки #2
Цитата Сообщение от BorAl Посмотреть сообщение
cout<<"Enter text\n";
* * * * cin.getline(str, 80);
* * * * cout<<"Text\n";
* * * * cout<<str<<endl;
-это ввод он должен идти перед

Цитата Сообщение от BorAl Посмотреть сообщение
for(int i=0; i < strlen(str); i++)
* * * * {
* * * * * * * * if (str[i]==' ')
* * * * * * * * * * * * {
* * * * * * * * * * * * * * * * n++;
* * * * * * * * * * * * }
* * * * * * * * n++;
* * * * }
Лжец
 Аватар для Лжец
31 / 31 / 3
Регистрация: 13.12.2011
Сообщений: 106
17.12.2011, 00:00     Удалить каждое четное слово из строки #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <cstring>
#include <Windows.h>
 
using namespace std;
 
void main()
{
        char str[80];
        int n=0;
        
        cout<<"Enter text\n";
        cin.getline(str, 80);
 
        for(int i=0; i < strlen(str); i++)
        {
                if (str[i]==' ') 
                {
                                n++;
                }
        
        }
 
        cout<<"Text\n";
        cout<<str<<endl;
 
        cout<<"Kolvo slov = "<<n;
        cout<<endl;
}
Локальные переменные при объявлении без инициализации всегда хранят мусор, поэтому их важно инициализировать при объявлении нулем.
BorAl
0 / 0 / 0
Регистрация: 09.12.2010
Сообщений: 22
17.12.2011, 00:35  [ТС]     Удалить каждое четное слово из строки #4
Ну да я наспех писал забыл присвоить n начальное значение! Но меня все смущает это выражение...
warning C4018: <: несоответствие типов со знаком и без знака
как от него избавиться? И может ли это как то повлиять на работу программы в дальнейшем при добавлении кода?

Добавлено через 27 минут
Мда. И все же мне нужна помощь в написании всей программы. У меня была такая задумка.
C++
1
2
3
char st[80];
if (n%2==0)
strcpy(st, str);
Но как оказывается все на много сложнее... прошу помощи...
-=ЮрА=-
Заблокирован
Автор FAQ
17.12.2011, 00:44     Удалить каждое четное слово из строки #5
Цитата Сообщение от Лжец Посмотреть сообщение
strlen(str
на сколько помню возврат от strlen не int а long.
вот так запишите

Цитата Сообщение от Лжец Посмотреть сообщение
for(int i=0; i < strlen(str); i++)
for(long i=0; i < strlen(str); i++)
BorAl
0 / 0 / 0
Регистрация: 09.12.2010
Сообщений: 22
17.12.2011, 12:18  [ТС]     Удалить каждое четное слово из строки #6
Цитата Сообщение от BorAl Посмотреть сообщение
Добавлено через 27 минут
Мда. И все же мне нужна помощь в написании всей программы. У меня была такая задумка.
C++
1
2
3
char st[80];
if (n%2==0)
strcpy(st, str);
Но как оказывается все на много сложнее... прошу помощи...
Что то я вообще не подумал! что n то у меня это количество пробелов!... тогда я вообще не знаю как...
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
17.12.2011, 12:33     Удалить каждое четное слово из строки #7
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <string.h>
 
#define DELIM " \t\n"
 
int main(void){
    char bufIn[BUFSIZ], bufOut[BUFSIZ], * p;
    int cnt;
    
    while ( printf("String: ") && fgets(bufIn, BUFSIZ, stdin) && *bufIn != '\n' ){
        *bufOut = '\0';
        cnt = 0;
        
        for ( p = strtok(bufIn, DELIM); p && ++cnt; p = strtok(NULL, DELIM) ){
            if ( cnt & 1 ){
                strcat(bufOut, p);
                strcat(bufOut, " ");
            }
        }
        
        printf("Odd words: %s\n", bufOut);
    }
    
    return 0;
}
BorAl
0 / 0 / 0
Регистрация: 09.12.2010
Сообщений: 22
17.12.2011, 12:37  [ТС]     Удалить каждое четное слово из строки #8
Конечно спасибо большое, но можно ли как то код подобный моему!
maniac0192
17 / 17 / 3
Регистрация: 27.11.2011
Сообщений: 141
17.12.2011, 12:38     Удалить каждое четное слово из строки #9
А реально нельзя ли посчитать колличество пробелов?????????
-=ЮрА=-
Заблокирован
Автор FAQ
17.12.2011, 12:46     Удалить каждое четное слово из строки #10
Цитата Сообщение от BorAl Посмотреть сообщение
Что то я вообще не подумал! что n то у меня это количество пробелов!... тогда я вообще не знаю как...
- очень просто
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
    int beg, end;
    char text[1024];
    cout<<"Enter text(less than 1024 chars)\n";
    cin.getline(text,1024);
    for(int i = 0, iWord = 0; i < strlen(text); i++)
    {
        if(text[i] == ' ')
        {
            beg = i;
            i++;
            while(text[i] != ' ')
                i++;
            iWord++;
            end = i;
            if((iWord - 1) % 2 == 0)
            if(strcpy(&text[beg], &text[end]))
                text[strlen(text) - (end - beg)] = '\0';
            i -= 2;
        }
    }
    cout<<"String after removing odd words\n";
    cout<<text<<endl;
    system("pause");//Äëÿ êîäáëîêñ Г*óæåГ* ГҐГ№Вё #include <cstdlib>
    return 0;
}
Миниатюры
Удалить каждое четное слово из строки  
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
17.12.2011, 12:48     Удалить каждое четное слово из строки #11
Цитата Сообщение от BorAl Посмотреть сообщение
но можно ли как то код подобный моему
Можно, но долго и муторно. По сути прийдётся сделать велосипед, заменяющий стандартную функцию strtok()

Цитата Сообщение от maniac0192 Посмотреть сообщение
А реально нельзя ли посчитать колличество пробелов?
Можно. Только для этой задачи бестолковое занятие. Между двумя первыми словами поставит пользователь больше одного пробела, и хана всей конструкции.
-=ЮрА=-
Заблокирован
Автор FAQ
17.12.2011, 12:49     Удалить каждое четное слово из строки #12
PS:BorAl, очень важно чтобы между словами был ровно 1-н пробел!
BorAl
0 / 0 / 0
Регистрация: 09.12.2010
Сообщений: 22
17.12.2011, 12:51  [ТС]     Удалить каждое четное слово из строки #13
Цитата Сообщение от easybudda Посмотреть сообщение
Можно, но долго и муторно. По сути прийдётся сделать велосипед, заменяющий стандартную функцию strtok()
Понятно что можно многое! но т.к. начинающий преподавателю надо то что он требует... Так что придется изобретать велосипед...

И да, между словами будет точно только один пробел!
-=ЮрА=-
Заблокирован
Автор FAQ
17.12.2011, 12:58     Удалить каждое четное слово из строки #14
BorAl, так что тебе не нравится в моём коде из поста 10???
Кстати - теперь можжно сколько угодно пробелов
Цитата Сообщение от easybudda Посмотреть сообщение
олько для этой задачи бестолковое занятие. Между двумя первыми словами поставит пользователь больше одного пробела, и хана всей конструкции.
- неа)))
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <string>
using namespace std;
 
 
int main()
{
    int beg, end;
    char text[1024];
    cout<<"Enter text(less than 1024 chars)\n";
    cin.getline(text,1024);
    for(int i = 0, iWord = 0; i < strlen(text); i++)
    {
        if(text[i] == ' ')
        {
            
            while(text[i] == ' ')
                i++;
            beg = i;
            i++;
            while(text[i] != ' ')
                i++;
            while(text[i] == ' ')
                i++;
            i--;
            iWord++;
            end = i;
            if((iWord - 1) % 2 == 0)
            if(strcpy(&text[beg], &text[end]))
                text[strlen(text) - (end - beg)] = '\0';
            i -= 2;
        }
    }
    cout<<"String after removing odd words\n";
    cout<<text<<endl;
    system("pause");//Äëÿ êîäáëîêñ Г*óæåГ* ГҐГ№Вё #include <cstdlib>
    return 0;
}
Миниатюры
Удалить каждое четное слово из строки  
-=ЮрА=-
Заблокирован
Автор FAQ
17.12.2011, 13:02     Удалить каждое четное слово из строки #15
BorAl,
Цитата Сообщение от BorAl Посмотреть сообщение
но т.к. начинающий преподавателю надо то что он требует...
в принципе в последнем коде вам всё должно біть понятно кроме єтой строчки
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if(strcpy(&text[beg], &text[end]))
- что же она делает
См наглядный пример
text = aaa bb ccc
beg = 3(т.е єто позиция пробела после aaa)
end = 6(єто пробел после bb)
strcpy(&text[beg], &text[end]) - перекопирует всё с end в beg (мы как бы вытрем bb)
text = aaa cccxxx (x - это мусор, который появится послде переноса - его просто отсекаем
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
text[strlen(text) - (end - beg)]
- вот и всё. Можно strcpy заменить ещё 1-м циклом for - но зачем раздувать код?)
BorAl
0 / 0 / 0
Регистрация: 09.12.2010
Сообщений: 22
17.12.2011, 13:02  [ТС]     Удалить каждое четное слово из строки #16
C++
1
2
 system("pause");//Для кодблокс нужен ещё #include <cstdlib>
        return 0;
вот без этого надо бы...
и не мог бы ты написать какая переменная за что отвечает?
beg, end, iWord
C++
1
2
3
if(strcpy(&text[beg], &text[end]))
                                text[strlen(text) - (end - beg)] = '\0';
                        i -= 2;
что мы делаем в этих строчках вот?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
17.12.2011, 13:03     Удалить каждое четное слово из строки #17
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Кстати - теперь можжно сколько угодно пробелов
После последнего слова пробел попробуйте поставить...
-=ЮрА=-
Заблокирован
Автор FAQ
17.12.2011, 13:03     Удалить каждое четное слово из строки #18
Цитата Сообщение от BorAl Посмотреть сообщение
от без этого надо бы...
- ну так удали и всё будет работать, что не знаешь просто уддаляй system("pause"); - єто аналог getch и всё
BorAl
0 / 0 / 0
Регистрация: 09.12.2010
Сообщений: 22
17.12.2011, 13:05  [ТС]     Удалить каждое четное слово из строки #19
Ну сейчас хоть что то начинает проявляться!!! а можно как то без while обойтись! у меня четко один пробел!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2011, 13:11     Удалить каждое четное слово из строки
Еще ссылки по теме:

C++ Разбить на слоги каждое четное слово в строке, а каждое нечетное записать в обратном порядке
C++ Удалить каждое четное слово из текстовой строки
Строки. Удалить каждое второе слово C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
17.12.2011, 13:11     Удалить каждое четное слово из строки #20
easybudda, это такой же мелкий устранимый недочёт - что даже код исправлять не хочу!В самом начале можно от конца строки пробелы отброситьт или записать в доп стринг(если хотим потом их дописать) и всё. Реально не ожидал такого замечания от знающего человека - важно что в строке пробелов можно сколь угодно много(а подрезать строку под слова - ЗАДАЧА ТРИВИАЛЬНАЯ!)

Добавлено через 35 секунд
Цитата Сообщение от BorAl Посмотреть сообщение
а можно как то без while обойтись! у меня четко один пробел!
- да сейчас, пару мин подпаяю

Добавлено через 4 минуты
BorAl, всё же этот while необходим - мы передвигаемся по строке пока не встретим конец слова
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
while(text[i] != ' ')
* * * * * * * * * * * * * * * * i++;
- без него никуда. Смысл цикла прост
aaa bb c
Допустим мы стали в пробел после aaa т.е
нужно в строке bb c отпарсить конец bb вот и запускаем цикл, которій остановится на пробеле после bb Пост 10 - лаконичней никак
Yandex
Объявления
17.12.2011, 13:11     Удалить каждое четное слово из строки
Ответ Создать тему
Опции темы

Текущее время: 15:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru