2015-12-29 8 views
0

Я получаю строку с клавиатуры, в C и Linux (Ubuntu 14.04):Выход из PRINTF вызова не адресности отображается на экране

char string[STR];  
fgets(string, STR, stdin); 

И я заметил, что strlen() не работает ,

Итак, я решил сделать следующее:

int i = 0;  
while (string[i] != '\0') { 
     printf("\nchar: %c\n", string[i]); 
     i++; 
} 
printf("\nFinished"); 

I типа "hello" в качестве входных данных, а выход заключается в следующем:

char: h 

char: e 

char: l 

char: l 

char: o 

char: 

"Finished" никогда не печатается.

Я не вижу, в чем проблема. Я подозреваю, что это связано с тем, что ввод с клавиатуры не завершен '\0'?

Вчера я работал с Windows и отлично работал со строками.

EDIT: STR определяется как 128.

+2

«STR» достаточно большой, чтобы '' hello \ 0'' вписывался в 'string [STR]'? –

+3

Попробуйте '' \ n'' после "Готово". – chux

+0

Что значит «' strlen' не работает »? Возвращает ли оно значение, которого вы не ожидаете? Это крушение? Это делает цикл программы бесконечно? Быть конкретной. – Badministrator

ответ

4

Из фрагментов кода вас в курсе, нет очевидных проблем. Я предполагаю, что это часть более крупной программы, и то, что вы наблюдаете, связано с буферизацией . Стандартный выходной поток, как правило, буферизируется в линии и периодически продувается (по мере заполнения буфера).

Так что добавление \n в конце printf может исправить, если stdout подключен к терминальному устройству. Если вы перенаправляете его в файл (./a.out >output), это также не исправит его. Так попробуйте позвонить fflush():

fflush(stdout); 

после вызова PRINTF.

Я говорю «часть более крупной программы», потому что в конце нормального завершения процесса все буферизованные выходные данные будут сброшены. Таким образом, нет необходимости в ручной промывке. При ненормальном завершении процесса буферный выход может быть потерян.

Другим способом отключить stdout буферизации полностью используя sebtuf():

setbuf(stdout, 0); 
+0

Добавление '\ n' работает. Я буду иметь в виду это и другие решения, которые вы предоставили. – Julen

1

Да он делает. fgets() хранит '\0' как последний байт, записанный (может быть, не последняя позиция в массиве).

Вы должны проверить возвращаемое значение fgets()и большинство функций с прототипом в <stdio.h>.

char x[100]; // unitialized, x[99] may be anything 
if (!fgets(x, sizeof x, stdin)) /* error; contents of x are not trustworthy */; 
x[strlen(x)] == '\0'; // true, always true 
         // provided the previous statement did not generate an error 
1

1.Если STR «s значения меньше, чем входной строки в (длина + терминации характер:„\ 0“), последний символ вашей входной строки не хранится в char string[STR];.Функция strlen() использует '\0', чтобы определить конец строки, поэтому без нее «не работает» и ваша программа работает в бесконечном цикле.

2.Буферизация может быть другой причиной, так как @ l3x прекрасно объясняет.

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