c - scanf 字符输入/输出
问题描述
scanf 无法正常输入字符正常工作
所以我只是在尝试 scanf() 和这个函数的正常输入/输出。我知道我必须在输入字符和操作数% 之前留一个空格,所以我的代码如下。不知何故,我不明白为什么我插入输出的任何输入都保持为 0。
#include<stdio.h>
int main()
{
char c ;
scanf(" %c",&c);
printf("%c",c);
return 0;
}
我期待输出将是我插入的任何字符。例如,通过键盘插入“A”,输出将完全是“A”。
我正在使用 vim 环境来编辑我的代码,但我发现如果我在代码块上运行此代码,它就可以工作。有什么不同?
解决方案
看来您没有从标准输入中提供任何非空白(被格式字符串中的空格,包括换行符)字符(或者根本没有)。如果发生这种情况,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
推荐阅读
- elasticsearch - 没有为弹性生成外部 IP
- javascript - 点击时TestCafe持久化数据
- node.js - 用户可以看到其他连接到socket的用户实时数据
- java - 如何使用相关的自动递增 ID 保存具有 OneToMany 关系的实体
- python - 即使在成功执行代码之后 pytest 说空套件并且没有打印打印语句
- python - 有没有办法向 matplotlib 子图添加第二个 y 轴?
- python - 如何将字符串数字转换为列表?
- node.js - 从更高的类访问函数
- python - pika.exceptions.ConnectionClosed:连接到 ***.***.*.*:5672 失败:超时
- asp.net - SelectedIndexChanging 未触发