Проблема с выводом последнего слова строки.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Добрый день!
Дали задание определить слова, в которых есть три латинских буквы «а» (слова разделены запятыми, в конце точка).
Проблема: при выполнении выводятся все нужные кроме последнего слова, в счетчик оно тоже не засчитывается. Смог решить это поставив запятую перед точкой, но оказалось не вариант.
Еще была мысль делать цикл не до точки а до первого пробела, а между словами пробелы убрать, это работало, но потом надо будет сделать ввод из консоли, и тот кто будет вводить слова может делать пробелы, так что это тоже не подошло.
Вообщем, прошу совета... за другие косяки не ругайте, только учусь.
За косяки не ругаю... но не могу не отметить: жу-у-уть.
Для того, что бы во входной строке посчитать слова, в которых есть ровно три латинских буква «а», совершенно необязательно вычленять слово из входной строки. Я немножко подкорректировал твое изделие.
Указатель ptr пробегает строку от начала до конца (до '\0'). Если текущий символ не является буквой
(!isalpha(*ptr))
, то считаем его разделителем слов. При этом, если счетчик букв «а» в только что закончившемся слове равен 3, то увеличиваем счетчик искомых слов, после этого сбрасываем счетчик букв «а», переводим указатель на следующий символ и переходим на начало цикла.Если же текущий символ буква, то значит мы находимся внутри слова. Здесь проверяем символ на «а» и, если нужно, увеличиваем счетчик букв «а» и переводим указатель на следующий символ.
Здесь есть пара подводных камней в виде локали и кодировки строки. Но для латиницы на это можно пока забить.
Жуть даже не в моем костыле, а в том что половина группы так ничего и не понимает в программировании, но это другая история...
За способ спасибо, разобрался что к чему (вроде), но в задании кроме подсчета слов должны те самые слова выводится. Для этого я и использовал вектор как единственный пока известный мне способ для буферизации слова, а буквы считались из самой сроки, сбрасывая счетчик натыкаясь на «небукву».
У меня остался только один вопрос: почему у меня при достижении точки не выполнялся цикл последний раз, если условие
while (line[k] != '.')
было после цикла, т.е. проход должен был быть?По аналогии с Вашим кодом я добавил после цикла такой костыль:
Последнее слово из буфера засчитало в счетчик и вывело в консоль, а значит буфер не очистился, значит что-то с последним циклом, чего я понять не могу....
РЕШЕНО
Цикл продолжать не до точки а до конца строки \0.
Я сейчас очень сильно матерюсь на себя.
Я ушел ̶ ̶у̶л̶у̶ч̶ш̶а̶т̶ь̶ пробовать не ухудшить свой костыль добавлением возможности ввода текста с консоли...
Это надо было сразу писать. Но не беда. Решается добавлением еще одного указателя, который отслеживает начало текущего слова. Печать слова вынес в отдельную функцию, что бы не дублировать код.
А еще можно сделать на регулярных выражениях.
Типа знаем С++11. Правда на указателях сильно пошустрее работать будет ;)