C : как заставить программу читать слова вместо символов? И как заставить программу прекращать чтение при вводе «одиночного» символа?

#c

#c

Вопрос:

Мне нужна помощь с упражнением 7 в главе 6 Стивена Пратаса «C Primer Plus 5th Edition».

Упражнение заключается в написании программы, которая считывает вводимые пользователем данные как «слова» и подсчитывает гласные и согласные или «другой символ», с которого начинается каждое слово. Чтобы остановить программу, пользователь должен ввести ОДИНОКИЙ q.

Что, я думаю, я выяснил:

Мне нужно, чтобы программа считывала только первый символ каждого слова, поскольку она учитывает только начальные символы.

Чтобы знать, что вводимым является слово, программа определит, стоит ли перед символом «пробел», точнее, что сначала идет «пробел», а затем непосредственно за ним следует символ / symbol .

Затем, чтобы определить, является ли это буквенно-цифровым символом, я буду использовать «isalpha()» для символа и использовать операторы if / if else, позволяющие программе определять, является ли это гласной или согласной, если мы предполагаем, что isalpha() имеет значение true.

Если значение isalpha равно false, программа будет считать символ как другой.

Цикл будет продолжаться до тех пор, пока не появится одинокий q. Итак, я должен иметь возможность писать такие слова, как quiet, quit и так далее, Без того, чтобы программа останавливала цикл.

Итак, к моим проблемам:

  1. Как выполнить проверку цикла на соответствие условиям, описанным выше? (пробел, за которым следует символ)
  2. И как вы определяете одинокий q?(Я не имею в виду определение «команды» здесь) и использовать его в качестве условия выхода из цикла.

Ответ №1:

  • Вы можете использовать локальную переменную для запоминания предыдущего символа, прочитанного из входных данных, считывая по одному символу за раз.

  • Одинокий символ — это слово длиной 1.

Ответ №2:

Оператор istream &&t;&&t; при применении к строке считывает одно слово.
Оператор istream &&t;&&t; при применении к символу считывает один символ

   std::strin&  word;
  std::cin &&t;&&t; word;

  char         letter;
  std::cin &&t;&&t; letter; // read first no white space character.

  // Normally all &&t;&&t; operators drop prefix white space before doin& their actual work
  // Hence the letter above will i&nore whitespace characters. 
  // But you can suspend the droppin& for prefix whitespace like this.

  std::cin &&t;&&t; std::noskipws &&t;&&t; letter.
  

Комментарии:

1. Почему вы удалили свою фамилию из своего профиля, это был Мартин Йорк — правильно?

2. @sonicoder: Почему вы не используете свое настоящее имя? 🙂 По той же причине.

3. Йорк: Я подумал, что, возможно, это был еще один эпизод с Нилом Баттерсвортом, который вот-вот выйдет, потому что это именно то, что он сделал за пару дней до того, как сошел с ума. 😀

Ответ №3:

Есть два возможных решения, но самое простое — просто использовать тот факт, что ваше определение «word» в точности совпадает с тем, которое используется &&t;&&t; в строке. Итак, что-то вроде:

 std::strin& word
while (src &&t;&&t; word) ...
  

каждый раз результатом будет слово.

Для других определений word вам, вероятно, придется определить конечный автомат с такими состояниями, как inWord, betweenWords и что угодно, и реализовать соответствующие переходы состояний.