Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 39, средняя оценка - 4.85
BorAl
0 / 0 / 0
Регистрация: 09.12.2010
Сообщений: 22
#1

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

16.12.2011, 23:52. Просмотров 6237. Ответов 28
Метки нет (Все метки)

Задача: Удалить каждое четное слово из строки. Это то что надо получить в конце, но т.к. я пытаюсь разобраться, хотелось бы по подробнее шаги рассмотреть!
Идею задачи я понимаю. Но сразу же столкнулся с проблемой написания кода...(подсчет количества слов в введенной строке)
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)) вот в этом месте. НЕ могли бы объяснить в чем моя ошибка!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.12.2011, 23:52
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Удалить каждое четное слово из строки (C++):

Удалить каждое четное слово из строки
Тема: строки в c++ Задание: Удалить каждое четное слово из строки.

Удалить каждое четное слово из строки
Удалить каждое четное слово из строки. Есть такое начало: #include...

Удалить каждое четное слово из текстовой строки
СТРОКИ: Удалить каждое четное слово из строки.

В тексте удалить каждое четное слово, продублировать каждое нечетное слово
Не могу решить данную задачу, много чего перечитал, за помощь буду благодарен&quot;...

В тексте удалить каждое четное слово, продублировать каждое нечетное слово
Не могу решить данную задачу, много чего перечитал, за помощь буду благодарен ...

Удалить каждое четное слово во введенной строке
удалить каждое четное слово во введенной строке

28
-=ЮрА=-
Заблокирован
Автор 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++;
* * * * }
0
Лжец
31 / 31 / 5
Регистрация: 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;
}
Локальные переменные при объявлении без инициализации всегда хранят мусор, поэтому их важно инициализировать при объявлении нулем.
0
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);
Но как оказывается все на много сложнее... прошу помощи...
0
-=ЮрА=-
Заблокирован
Автор 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++)
0
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 то у меня это количество пробелов!... тогда я вообще не знаю как...
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,230
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;
}
0
BorAl
0 / 0 / 0
Регистрация: 09.12.2010
Сообщений: 22
17.12.2011, 12:37  [ТС] #8
Конечно спасибо большое, но можно ли как то код подобный моему!
0
maniac0192
17 / 17 / 5
Регистрация: 27.11.2011
Сообщений: 141
17.12.2011, 12:38 #9
А реально нельзя ли посчитать колличество пробелов?????????
0
-=ЮрА=-
Заблокирован
Автор 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;
}
0
Миниатюры
Удалить каждое четное слово из строки  
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,230
17.12.2011, 12:48 #11
Цитата Сообщение от BorAl Посмотреть сообщение
но можно ли как то код подобный моему
Можно, но долго и муторно. По сути прийдётся сделать велосипед, заменяющий стандартную функцию strtok()

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

И да, между словами будет точно только один пробел!
0
-=ЮрА=-
Заблокирован
Автор 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;
}
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 - но зачем раздувать код?)
0
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;
что мы делаем в этих строчках вот?
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,230
17.12.2011, 13:03 #17
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Кстати - теперь можжно сколько угодно пробелов
После последнего слова пробел попробуйте поставить...
0
-=ЮрА=-
Заблокирован
Автор FAQ
17.12.2011, 13:03 #18
Цитата Сообщение от BorAl Посмотреть сообщение
от без этого надо бы...
- ну так удали и всё будет работать, что не знаешь просто уддаляй system("pause"); - єто аналог getch и всё
0
BorAl
0 / 0 / 0
Регистрация: 09.12.2010
Сообщений: 22
17.12.2011, 13:05  [ТС] #19
Ну сейчас хоть что то начинает проявляться!!! а можно как то без while обойтись! у меня четко один пробел!
0
-=ЮрА=-
Заблокирован
Автор 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 - лаконичней никак
1
17.12.2011, 13:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2011, 13:11
Привет! Вот еще темы с решениями:

Разбить на слоги каждое четное слово в строке, а каждое нечетное записать в обратном порядке
Нужно разбить на слога каждое слово на парной позиции в строчке,а каждое на...

Удалить каждое парное слово из строки
Удалить каждое парное слово из строки. С++

Строки. Удалить каждое второе слово
Например вводим : Dobruy vecher gorod Выводим : Dobruy gorod Заранее спасибо!

Найти количество простых чисел в массиве. Перевернуть все нечетные строки матрицы. Перевернуть каждое четное слово в строке
Ребята помогите разобраться в коде программы, написав подробные комменты к...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru