2015-06-02 3 views
0

Я пытаюсь работать через «Язык программирования C», и у меня возникают проблемы с printf и символом EOF. Я работаю с терминалом mac и компиляцией с clang.printf printing extra «D» после getchar() call

Выполнение этого кода:

#include <stdio.h> 

main() 
{ 
    int val; 
    while ((val = getchar()) != EOF) 
     printf("%d\n", val); 
    /*val = 5;*/ 
    /*printf("hi\n");*/ 
    /*printf("%d\n", val);*/ 
    printf("%d\n", val); 
} 

работает как я хотел бы ожидать, блокирование, пока я не ввести символ, то печать: "*character code*\n10\n", для ctrl-d, который печатает кроме "-1" затем выходит

После раскомментирован. "val = 5;" заявление, однако ввод «ctrl-d» вызывает его печать: "5D".

Я испортил его и нашел что печать VAL второй раз (третий прокомментировал заявление) приведет только one "D": "5D\n5", и что печать константы перед переменными (вторым прокомментировали заявление) останавливает «D» от появления: "hi\n5\n5".

Я абсолютно не хочу D, и если кто-нибудь сможет объяснить, как его удалить, я был бы очень благодарен.

+0

Этого не должно быть. Каков ваш точный ввод? –

+0

Предложение: 'main()' -> 'int main (void)' –

+2

Не могли бы вы предоставить один ясный пример вашего кода и ожидаемого поведения? Есть некоторые несоответствия между вашим текстом и вашим кодом, из-за чего трудно следовать :) –

ответ

1

Итак, что происходит, консольный ввод печатает то, что вы набираете. Так же, как если бы вы написали букву A, печатается буква A. CTRL-D печатается на stdout как^D.

Если вы печатаете 1 символ, символ^перезаписывается. Если вы печатаете 2 символа, оба символа^и D перезаписываются. Итак, -1 перезаписывает его, перезаписывает его, но 1 символ не будет.

+0

Это «нормально» на Mac; Я не уверен в других системах, хотя я уверен, что вы можете заставить его и на Linux. Полагаю, что параметр 'stty'' echoctl' управляет этим (проверьте с помощью 'stty -a'). –

+0

На самом деле, Linux (Ubuntu 14.04) не echo '^ D', если это EOF. Он будет эхом '^ A','^B' и т. Д. Для ряда других символов, но остерегайтесь тех, которые имеют особое значение. Mac тоже выполняет эхо '^ D'. –

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