繁体   English   中英

scanf 字符输入/输出

[英]scanf character input/output

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

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

 #include<stdio.h>

 int main()
 {
  char c ;

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

  return 0;
  }

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


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

看来您没有从标准输入中提供任何非空白(被格式字符串中的空格,包括换行符)字符(或者根本没有)。 如果发生这种情况, scanf将无法解析 char 并c未初始化。

使用未初始化的变量是Undefined Beheavior ,所以理论上任何事情都可能发生。 实际上,根据您的描述,听起来 memory 为c保留的字节值恰好是/0 ,这是不可打印的字符,所以printf可能什么也没有打印。 然后环境( 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;
 }

实用提示:在没有终端的情况下提供标准输入(所以你不能输入输入),你可以 pipe 东西:

echo A | ./thisprogram

我试图运行你的程序(正如它出现在你的问题中一样)

pru.c

 #include<stdio.h>

 int main()
 {
  char c ;

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

  return 0;
  }

并使用您在问题中发布的输入(只是AEnter )并得到以下结果:

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

这正是预期的 output。 所以问题肯定出在其他地方,或者你有一个完全不同的场景,需要提供更多信息。

我在带有 FreeBSD 12.0/CLANG 编译器的 PC(Intel Core Duo)上对此进行了测试。 (这里$是unix提示符, _是运行后的cursor)当然,程序已经用vi(1)编辑过了(这对结果没有影响)。

编辑

尝试改变

  printf("%c",c);

这样

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

因此,您将获得刚刚输入的字符的十六进制转储,以及它的打印表示。 最后的\n是为了确保您的 shell 提示没有吃掉(覆盖)程序的最后一行 output (主要是如果您更改了提示变量PS1 )隐藏打印的字符。

这应该产生(在您发布的输入上)以下 output:

$ 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM