2016-02-07 5 views
-1

У меня есть простая программа (на примере с языка программирования C изм. 2 раздела 1.5.2) для подсчета символов. Сама программа очень проста, однако я не получаю ожидаемых результатов.C Для выполнения цикла

Кажется, что numberOfChars увеличивается в два раза, и я не знаю почему ...?

Я использую Cygwin + компилятор GCC, пожалуйста, см изображение: compilation+test

int main() { 
    int numberOfChars; 

    for(numberOfChars = 0; getchar() != EOF; numberOfChars++) 
     ; //null statement 

    printf("Number of chars = %d\n", numberOfChars); 

    return 0; 
} 

Спасибо за любую помощь :-)

+2

Для пустого оператора используйте '{}' вместо ';'. Потому что ';' сразу после того, как цикл 'for' может выглядеть как опечатка, а когда это тип, это очень сложная ошибка, поэтому некоторые компиляторы выдадут предупреждение с вашим кодом. Пожалуйста, опубликуйте ввод, фактический результат и желаемый результат. –

+3

Пожалуйста, не публикуйте текст как изображения. Вместо этого скопируйте/вставьте текст в вопрос. – fuz

+1

@Pavel getchar считывает все символы, включая новый символ строки. Поэтому, если вы нажмете Enter, тогда будет также подсчитано '\ n'. –

ответ

0

Чтобы получить 3, вы можете написать:

#include <stdio.h> 

int main() { 
     int numberOfChars = 0; 

     do { 
       while(getchar() != '\n') 
         numberOfChars++; 
     } while(getchar() != EOF && numberOfChars++); 

     printf("Number of chars = %d\n", numberOfChars); 

     return 0; 
} 

Затем нажмите Ctrl + D для выхода из вложенного цикла.

Фактически, ваша программа верна. Он дал вам 6, поскольку вы ввели 6 символов: 1, \n, 2, \n, 3, \n.

+1

Это непостижимый код, не помогающий отсутствием скобок вокруг тела внешнего цикла do ... while. Если тело цикла представляет собой составной оператор (что-то более сложное, чем вызов назначения или функции), используйте фигурные скобки. Я вижу, как работает код. Я не уверен, что код является полезной модификацией. Он также не учитывает дополнительную строку новой строки, поэтому он дает неправильный ответ. Отправка указателя EOF в код также отправляет его в тиззи. –

+0

@JonathanLeffler Улучшено, выглядит лучше? –

+1

Вызов getchar более одного раза, не относящийся к идиоматическому C, задающему вопрос просто нужно запустить программу в файле, которую он может проверить с помощью чего-то типа 'od -c', чтобы избежать путаницы. – Rob11311

0

Создайте файл, а затем запустить программу Cygwin О.Д., а затем пробеге программы Пример C:

od -x < testfile 
a.out < testfile 

Тогда вы можете увидеть, что & сколько символов вы имели именно в файле и избежать сюрпризов ,

Как помощь в отладке, если я заподозрил неладное, я хотел бы добавить что-то вроде:

int c; for(numberOfChars = 0; (c = getchar()) != EOF; numberOfChars++) 
    printf("\0x%x", c); 

Чтобы понять обработку мой код делал.

Смежные вопросы