【发布时间】:2021-06-05 16:00:55
【问题描述】:
我一直在努力让这段代码正常工作:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char const **argv) {
char buf[100];
int var = 0;
do {
printf("Write a number :\n");
scanf("%s", buf);
} while ((int)strtol(buf, NULL, 10) == 0);
return 0;
}
在控制台中是这样的:
chaouchi@chaouchi:~/workspace/Demineur$ ./a.out
Write a number :
f 10
Write a number :
chaouchi@chaouchi:~/workspace/Demineur$
我不明白为什么程序在while 循环的第二次迭代中停止并忽略了我的scanf()。
【问题讨论】:
-
不相关,但为了避免从一开始就养成一个坏习惯:始终限制从外部源读取的数据长度为缓冲区长度。在这里,使用
scanf读取buf的输入很容易出现缓冲区溢出,这是最常见的安全漏洞之一。请参阅手册页,了解如何正确限制字符数。 -
你检查
scanf和errno的返回值了吗? -
你为什么要使用
strtol?如果您要使用 scanf,只需使用%ld转换说明符。您必须检查 scanf 返回的值。
标签: c while-loop scanf strtol