Вложение различных составных операторов, таких как for
и do
/ while
, допускается в C как минимум до 127 уровней, как указано в 5.2.4.1 Пределы перевода .
Проблема не в синтаксисе, а в концептуальном:
ваш цикл do
/ while
выполняет итерации с постоянным условием, поскольку ни i
, ниsent
изменяется в теле или в состоянии цикла, приводя к бесконечному циклу, если sent[i]
является пробелом.
подсчет пробелов не является правильным подходом к подсчетуслова в строке: ""
имеет 0
слов, не 1
для вашего предполагаемого кода, " "
также, но вы получите 2
, а "A B"
имеет только 2
слов, а не 3
.
Вы должны посчитать количество переходов из пробела в пробел, начиная с неявного пробела до начала строки.
noteтакже, что char sent[] = "...";
является не символьным указателем, а символьным массивом.
Вот модифицированная версия:
//program to count words
#include <stdio.h>
int main() {
int i, words, last;
char sent[] = "How are you doing mister?";
words = 0;
last = ' ';
for (i = 0; sent[i] != '\0'; i++) {
if (sent[i] != ' ' && last == ' ')
word++;
last = sent[i];
}
printf("There are %d words in the sentence '%s'\n", words, sent);
return 0;
}
В моем коде для прочтения корректуры, как правило, циклы do
/ while
написаны неправильно, особенно новичками, пропущенными условиями тестирования или нарушеннымикаким-то другим способом.Если вы думаете, что цикл do
/ while
решает данную проблему, подумайте еще раз, цикл for
может быть более безопасным.Единственное место, где необходимы циклы do
/ while
, - это расширение макроса, где вы хотите объединить несколько операторов в один составной оператор:
#define swap_ints(a, b) do { a ^= b; b ^= a; a ^= b; } while (0)
Обратите внимание, что метод подстановки в этом макросенеэффективные и макросы очень подвержены ошибкам, и их следует избегать даже больше, чем do
/ while
loop:)