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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
WebMacTep
21 / 21 / 1
Регистрация: 03.10.2013
Сообщений: 128
#1

Разбить строку на слова - C++

23.02.2014, 21:18. Просмотров 618. Ответов 6
Метки нет (Все метки)

Добрый день. Есть массив char (say), в него вводят строку (два-три слова) с пробелами и без пробела в конце. Цикл разбивает её на отдельные слова. Мой вопрос вот в чём: почему если в конце пробела нет, то выводится какая-то ерунда на третьей строке, если слова всего два? Если пробел в конце, тогда всё работает как часы. Подскажите, кто чем может. Код, конечно, под спойлером.

Код
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 <cstdio>
 
using namespace std;
 
int main()
{
    char say[256];
    char word[80];
    gets(say);
 
    int i = 0;
    int q = 0;
 
    while (say[i])
    {
        for (q, i; (say[i] != ' ') and (say[i]); q++, i++)
        {
            word[q] = say[i];
        }
 
 
        word[q] = '\0';
        puts(word);
 
        i++;
        q = 0;
    }
 
    return 0;
}
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Amandosov
Знаток
156 / 156 / 65
Регистрация: 18.11.2012
Сообщений: 411
Записей в блоге: 2
24.02.2014, 19:17     Разбить строку на слова #2
Если попробовать так
C++
1
for (q, i; (say[i] != ' ') and (say[i]) and (say[i]!='\0'); q++, i++)
WebMacTep
21 / 21 / 1
Регистрация: 03.10.2013
Сообщений: 128
24.02.2014, 22:13  [ТС]     Разбить строку на слова #3
Amandosov, не изменилось ничего. И, если я не ошибаюсь, то say[i] и say[i]!='\0' один и тот же смысл имеют. Поправьте, если напутал. Хотя я практически уверен, что ошибка именно в условии for.
sashaa355
7 / 3 / 1
Регистрация: 23.02.2014
Сообщений: 18
24.02.2014, 22:48     Разбить строку на слова #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
        puts(word);
 
        i++;               //<--- Здесь все ошибки. 
        q = 0;
Последний символ ('\0') или (say[i]) - символ конца строки. Вы его пропускаете делая i++ Таким образом цикл while (say[i]) читает следующий символ, а этот символ может быть каким угодно (любой мусор), таким образом он продолжает работать

Удачи. Кстати, не советую использовать gets, puts для подобных операций, но это ваше дело

Добавлено через 5 минут
Можете прибавить под конец цикла while строки, перед етим удалив i++ из вашего кода

C++
1
2
3
4
5
        
        if(say[i])
            i++;
        else
            break;
и все будет работать
WebMacTep
21 / 21 / 1
Регистрация: 03.10.2013
Сообщений: 128
24.02.2014, 23:26  [ТС]     Разбить строку на слова #5
sashaa355, точно! Никогда бы не подумал, что именно тут оплошал. Всё в условиях бы ошибку искал. Спасибо огромное! Кстати, а каким ещё образом можно получить массив char, кроме gets и посимвольного ввода? А puts и правда стоит убрать.
sashaa355
7 / 3 / 1
Регистрация: 23.02.2014
Сообщений: 18
25.02.2014, 00:05     Разбить строку на слова #6
cin.getline(char* s, streamsize n );
или просто

C++
1
2
3
string inputText;
getline(cin, inputText);    //и у нас string из char к которым можно обращаться
inputText[n] :)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2014, 18:43     Разбить строку на слова
Еще ссылки по теме:

C++ Разбить строку на слова
Разбить строку на слова, добавить эти слова в массив строк C++
C++ Разбить строку на слова, удвоить пробелы
C++ Разбить строку на слова и заменить каждое на соответствующее ему число
Разбить строку S на слова заданного набора всеми возможными способами C++

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

Или воспользуйтесь поиском по форуму:
WebMacTep
21 / 21 / 1
Регистрация: 03.10.2013
Сообщений: 128
25.02.2014, 18:43  [ТС]     Разбить строку на слова #7
sashaa355, спасибо! Буду пробовать!
Yandex
Объявления
25.02.2014, 18:43     Разбить строку на слова
Ответ Создать тему
Опции темы

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