首页 > 解决方案 > scanf 字符输入/输出

问题描述

scanf 无法正常输入字符正常工作

所以我只是在尝试 scanf() 和这个函数的正常输入/输出。我知道我必须在输入字符和操作数% 之前留一个空格,所以我的代码如下。不知何故,我不明白为什么我插入输出的任何输入都保持为 0。

 #include<stdio.h>

 int main()
 {
  char c ;

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

  return 0;
  }

我期待输出将是我插入的任何字符。例如,通过键盘插入“A”,输出将完全是“A”。


我正在使用 vim 环境来编辑我的代码,但我发现如果我在代码块上运行此代码,它就可以工作。有什么不同?

标签: c

解决方案


看来您没有从标准输入中提供任何非空白(被格式字符串中的空格,包括换行符)字符(或者根本没有)。如果发生这种情况,scanf将无法解析 char 并且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

推荐阅读