c - 在 C 中使用 scanf 后 getchar 无法正常工作
问题描述
我正在写这段代码:
int b;
char c;
scanf("%d", &b);
while((c = getchar()) != EOF) {
if(c >= 9 || c < 0) {
printf("Invalid number!\n");
exit(0);
}
}
当我分配b
时,自动c
等于b
。例如,如果我的输入为b
is 10
,它会自动进入if
- 语句并退出代码。
有谁知道为什么?
解决方案
发现问题并解决它们
下面列出的代码中有很多错误。
-
getchar()
相当于getc(stdin)
。的原型
getc()
是:int getc(FILE *stream);
也就是说,
getchar()
返回一个整数(来自unsigned char
强制转换)。因此,我们需要将类型从更改为char
正确int
接受它的返回值。请注意,这
EOF
不是有效的unsigned char
. 它扩展到signed int
-1。 永远不要忽略
scanf(3)
. 它返回正确传递的参数的数量。在这种情况下,为了使代码可靠,我们应该输入:if (scanf("%d", &b) != 1) { fprintf(stderr, "Value must be an integer.\n"); return EXIT_FAILURE; }
条件中存在语义错误:
if (c >= 9 || c < 0) ^^____________ logically, 9 is a valid one digit number so removing '=' from here makes more sense
一件值得注意的事情是比较器的条件和类型——两者都应该改变。请参阅下一步。
固定循环应如下所示:
while ((c = getchar()) != EOF) { if (c == '\n') // Since c = getchar() can be '\n' too continue; // so, better ignore if (c >= '0' && c <= '9') // Change the loop like this printf("Valid number %d %c.\n", c, c); else printf("Invalid number.\n"); }
示例测试用例输出
1
10 // --- Note: 10 are two chars for two getchars
Valid number 49 1.
Valid number 48 0.
3
Valid number 51 3.
9
Valid number 57 9.
-
Invalid number.
a
Invalid number.
<
Invalid number.
.
Invalid number.
推荐阅读
- ethereum - ethereum 文件夹中没有 geth.ipc
- postgresql - 使用 r2dbc-postgresql 的事务
- java - 从 Jshell 运行 echo 示例
- r - 使用变音符号查看(kwic)
- java - 使用 IPv6 的 Java 套接字编程
- node.js - Nodejs express 显示服务器内容而不是渲染页面
- sql - ID 为“ALL”的外键问题
- javascript - 在 xml 有效负载中使用 javascript 替换所有值
- php - 插件运行时 wordpress 变得无响应
- vue.js - Vue CLI 应用程序中带有 jsPDF 的 html2canvas 不起作用