[英]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
我试图运行你的程序(正如它出现在你的问题中一样)
#include<stdio.h>
int main()
{
char c ;
scanf(" %c",&c);
printf("%c",c);
return 0;
}
并使用您在问题中发布的输入(只是A
加Enter )并得到以下结果:
$ 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.