Scanf ввод / вывод символов - PullRequest
1 голос
/ 23 сентября 2019

scanf не работает должным образом с обычным символом ввода

Так что я просто пробовал scanf () и нормальный ввод / вывод этой функции.Я знаю, что мне пришлось оставить пробел перед входным символом и операндом%, поэтому мой код такой, как показано ниже.Почему-то я не понимаю, почему независимо от того, какой ввод я вставил, выход остается 0.

 #include<stdio.h>

 int main()
 {
  char c ;

  scanf(" %c",&c);
  printf("%c",c);

  return 0;
  }

Я ожидал, что вывод будет любым символом, который я вставлю.Например, вставьте «A» через клавиатуру, и вывод будет точно «A».


Я использую среду vim для редактирования своего кода, но я обнаружил, что если я запусту этоткод на кодовых блоках это работает.Какая разница?

Ответы [ 2 ]

5 голосов
/ 23 сентября 2019

Похоже, вы не предоставляете никакие непробельные символы (которые уничтожаются пробелом в строке формата, включая символы новой строки) (или, возможно, вообще ничего) из стандартного ввода.Если это произойдет, scanf не сможет проанализировать символ и оставит c неинициализированным.

Использование неинициализированной переменной - это Undefined Beheavior , поэтому в теории что-нибудь могло случиться.На практике из вашего описания это звучит так, как будто память, зарезервированная для c, имеет байтовое значение 0, которое является непечатаемым символом, поэтому printf печатает что-то еще (возможно, /0, может быть, ничего).И тогда среда ( vim ) может показать вам код завершения программы, также здесь 0 (при условии, что неопределенное поведение не вызывает сбой вашей программы).

Чтобы это исправить, проверьте возвратзначение scanf:

 #include<stdio.h>

 int main()
 {
   char c ;

   int r = scanf(" %c",&c);
   if (r==1) {
      // Always print something and add newline
      // to be sure we see some output always.
      printf("c='%c'\n",c);
   } else {
      printf("scanf error: %d\n", r);
      // If r==-1, errno variable tells what error was
   }
   return 0;
 }

Практический совет: для обеспечения стандартного ввода, когда нет терминала (поэтому вы не можете набрать ввод), вы можете передать что-то:

echo A | ./thisprogram
1 голос
/ 24 сентября 2019

Я пытался запустить вашу программу (в точности так, как это выглядит в вашем вопросе)

pru.c

 #include<stdio.h>

 int main()
 {
  char c ;

  scanf(" %c",&c);
  printf("%c",c);

  return 0;
  }

и с учетом того, что вы разместили в своем вопросе (просто A плюс Введите ) и получите следующий результат:

$ cc pru.c
$ ./a.out
A
A$ _

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

Я тестировал это на ПК (Intel Core Duo) с компилятором FreeBSD 12.0 / CLANG.(здесь $ - приглашение Unix, а _ - курсор после запуска) И, конечно, программа была отредактирована с помощью vi(1) (это не влияет на результат).

Редактировать

Попробуйте изменить

  printf("%c",c);

этим

  printf("0x%02x, [%c]\n",c,c);

, чтобы получить шестнадцатеричный дамп только что введенного символа, а также его представление в виде печати.,\n в конце означает, что приглашение вашей оболочки не потребляет (не перезаписывает) вывод последней строки вашей программы (в основном, если вы изменили переменную приглашения PS1), скрывая напечатанный символ.

Это должно привести к (на вашем опубликованном входе) следующий вывод:

$ cc pru.c                <--- compilation of new pru.c
$ ./a.out                 <--- default name for your program executable.
A                         <--- this is your input (followed by <return>)
0x41, [A]                 <--- this should be your program output.
$ _                       <--- prompt (and cursor) after your program execution

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...