Member 14849246 Ответов: 3

Я не понимаю условия обновления логики цикла


#include<stdio.h>
void main()
    {
    char name[40];
    printf("Enter the string:");
    gets(name);
    char ch = ' '; 
    int i,count=0;
    for(i=0; name[i]; i++)
       {
       if(name[i]==' ')
          count++;	
       }
    printf("Number of words is %d",(count)+1);
}


Что я уже пробовал:

пытался понять несколько раз, но не мог понять этого

Patrice T

Дайте подробности, какую часть цикла вы не понимаете ?

Member 14849246

тестовое условие то, что он пытается передать я имею в виду что-то сравнить с i< как это, но это просто символ

Richard MacCutchan

Это тот же самый вопрос, который вы разместили на форуме C/C++. Пожалуйста, не пересекайте столб.

KarstenK

Ваш счетчик пропустит последнее слово, когда пробел не является последним символом. И когда пользователь дает более 40 символов, он рухнет.

3 Ответов

Рейтинг:
2

OriginalGriff

Цитата:
тестовое условие то, что он пытается передать я имею в виду что-то сравнить с i< как это, но это просто символ

А! Это довольно просто: C-очень старый язык, и у него нет понятия булевых значений. Вместо этого он работает на нуле / ненулевом значении: любое ненулевое значение является "истинным", и только ноль является "ложным".

Таким образом, ваше условие цикла проверяет символ на "нуль" - и поскольку C-это старый язык, он также не имеет понятия строк: вместо этого массиву символов нужен "нулевой символ" '\0' в конце данных, чтобы сообщить ему, когда строка заканчивается. Итак, "Майк" - это массив из пяти символов:
arr[0] = 'M'
arr[1] = 'i'
arr[2] = 'k'
arr[3] = 'e'
arr[4] = '\0'
Без нулевого Терминатора символы просто продолжали бы просматриваться до тех пор, пока программа не потерпит крах или не найдет случайный нуль в памяти где-нибудь.


Member 14849246

если мы дадим вход perm0n0nt , то программа должна дать счет 2, что неверно

Рейтинг:
0

OriginalGriff

Во - первых, отступы и пробелы в коде-это делает его намного более читабельным. (Я сделал это для вашего вопроса - видите, насколько легче увидеть, что происходит?)

Цикл for прост:

for (a; b; c)
   d
1) Перед началом цикла оператор a выполняется для инициализации цикла.
2) затем утверждение b ecxcuted - если он возвращает ненулевое значение, то тело цикла d выполняется, если цикл не завершается.
3) после каждого раза d был казнен, c выполняется для продвижения цикла к следующей итерации, и процесс продолжается с (2) выше.

Красиво и просто, как и ваш код...
Если вы все еще не понимаете свой цикл, то используйте отладчик, чтобы пройти через цикл во время его выполнения и посмотреть, что именно происходит - это должно помочь вам решить его за несколько секунд.


Рейтинг:
0

Patrice T

Цитата:
Я не понимаю условия обновления логики цикла

Петля
for(i=0; name[i]; i++)

это то же самое, что
for(i=0; name[i]!=0; i++)

В языке C строка в виде массива символов завершается 0.
Этот
char name[40];

означает, что имя может быть 39 полезных символов + 1 символ значения 0, который говорит о том, что строка завершается.

Это сочетается с тем фактом, что логический тип не существует в C, но моделируется со значением non 0, которое означает true, а значение 0-false.
С точки зрения C, символ-это 8-битное целое число.
Цитата:
когда мы нажимаем enter, это символ "\0", который равен нулю для компилятора c?

Это не связано с вводом.
Взгляните на сбежавшие символы В С.
Escape-последовательности в C - Википедии[^]
Escape-последовательности В C - GeeksforGeeks[^]


Member 14849246

когда мы нажимаем enter, это symobol'\0' , который равен нулю для компилятора c?