gpt4 book ai didi

c - 使用 fgets 和 strtol 获取单个整数

转载 作者:行者123 更新时间:2023-12-02 02:55:57 25 4
gpt4 key购买 nike

我正在学习 C,我正在尝试使用 fgets()strtol() 来接受用户输入并只取第一个字符。我将制作一个菜单,允许用户选择选项 1-3 和 4 退出。我希望只有在选择“1”、“2”、“3”或“4”时才选择每个选项。我不希望“asdfasdf”工作。我也不希望“11212”选择第一个选项,因为它以 1 开头。到目前为止,我在开始测试时创建了这段代码,出于某种原因,这个循环遍历了问题并为输入提供了 0。

#include <stdio.h>
#include <stdlib.h>

int main() {
char a[2];
long b;

while(1) {
printf("Enter a number: ");

fgets(a, 2, stdin);

b = strtol(a, NULL, 10);

printf("b: %d\n", b);
}
return 0;
}

输出

Enter a number: 3
b: 3
Enter a number: b: 0
Enter a number:

应该是:

Enter a number: 3
b: 3
Enter a number: 9
b: 9

最佳答案

你需要有足够的空间让 '\n' 被读取,否则它将留在输入缓冲区中,下一次迭代将立即读取它,从而使 fgets() 返回空字符串,因此 strtol() 返回 0

阅读fgets()的文档,它一直读取到 '\n' 或直到缓冲区已满。所以第一次,它停止了,因为它没有更多的空间来存储字符,然后第二次它仍然需要读取 '\n' 并立即停止。

一个可能的解决方案是增加缓冲区大小,以便读取 '\n' 并将其存储在其中。

另一种解决方案是读取 fgets() 之后的所有剩余字符。

第二种解决方案可以通过一次读取一个字符来干净地实现,因为您只对第一个字符感兴趣,您可以丢弃任何其他字符

#include <stdio.h>
#include <stdlib.h>

int main()
{
int chr;
while (1) {
// Read the next character in the input buffer
chr = fgetc(stdin);
// Check if the value is in range
if ((chr >= '0') && (chr <= '9')) {
int value;
// Compute the corresponding integer
value = chr - '0';
fprintf(stdout, "value: %d\n", value);
} else {
fprintf(stderr, "unexpected character: %c\n", chr);
}
// Remove remaining characters from the
// input buffer.
while (((chr = fgetc(stdin)) != '\n') && (chr != EOF))
;
}
return 0;
}

关于c - 使用 fgets 和 strtol 获取单个整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49460307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com