Правильно ли использовать цикл do-while внутри цикла for?Почему и почему нет? - PullRequest
0 голосов
/ 27 июня 2019
//program to count words
#include<stdio.h>
int main()
{
    int i;
    int word = 0;
    char sent[] = "How are you doing mister";  //character pointer
    for (i = 0; sent[i] != '\0'; i++)
    {
        do
        {
            word++;

        } while (sent[i] == ' ');
    }
    printf("There are %d words in the sentence\n", word + 1);  //words are always 1 more than the no. of spaces.
    return 0;                                                  //or word=1;
}

Это код для подсчета количества слов.Пожалуйста, скажите мне, почему мы не можем использовать циклы do-while внутри цикла for.Или, если сможем, как это сделать.

Ответы [ 2 ]

3 голосов
/ 27 июня 2019

Вложение различных составных операторов, таких как 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:)

1 голос
/ 27 июня 2019

Вполне допустимо вкладывать цикл do-while в цикл for.Синтаксически, нет ничего плохого в вашей программе.

Однако, как уже описывали другие, ваш вложенный цикл никогда не завершится, когда sent[i] == ' '.В вашей программе есть ошибки, но они не имеют ничего общего с достоверностью вложенных циклов.

...