Определенный код C не отображает выходные данные в коде VS

#c #visual-studio-code

Вопрос:

Итак, в принципе, у меня есть эта простая программа Hello World, и при выполнении она выводится правильно.

 #include lt;stdio.hgt;  int main(){  printf("Hello"); }  
 Output: Hello  

Но по какой-то причине добавление команды scanf приведет к тому, что программа ничего не выведет. Он покажет, что он запущен, но ничего не отобразит.

 #include lt;stdio.hgt;  int num1;  int main(){  printf("Enter number: n");  scanf("%d", amp;num1);  printf("%d", num1); }  

Выход:

 [Running] cd "d:programming" amp;amp; gcc main.c -o main amp;amp; "d:programming"main  

Я знаю, что мой код в порядке, так как я пробовал его на других IDE, и он работал правильно. Я даже скопировал код из Интернета и попытался запустить его в VSCode, но это все равно не сработало. Вчера он все еще отлично работал, но эта проблема просто возникла из ниоткуда.

Я использую код Visual Studio 1.62.3 с расширениями компиляции C/C , C/C и Code Runner.

Ответ №1:

Это проблема с буферизацией. Когда стандартный вывод ( stdout , где printf выполняется запись) подключен к фактическому терминалу, он буферизован по строкам, что означает, что вывод фактически записывается в терминал, когда появляется новая строка.

Однако VSCode, вероятно, использует свою собственную эмуляцию терминала и использует каналы для подключения stdout к этому терминалу. Это означает, что выходные данные будут полностью буферизованы, и вам необходимо явно очистить их.

Поэтому измените код как таковой:

 printf("Enter number: n"); fflush(stdout); // Actually write the output to standard output scanf("%d", amp;num1); printf("%d", num1);  

То, что это работает в первом примере, объясняется тем, что затем процесс завершается, и все выходные данные автоматически сбрасываются.

Комментарии:

1. Это сработало, спасибо! @Какой-то чувак-программист, хотя я не включал это fflush(stdout); раньше, и это все еще работает. По какой-то причине эта проблема возникла совсем недавно. Нужно ли мне вставлять это только один раз?