我正在尝试将数字字符串输入转换为整数。当我输入 2 时,我的输出是 0
scanf( "%d", betNumber );
printf("What number do you want to bet? \n");
printf("Here is your number: %d\n" ,atoi(betNumber));
用户输入 = 2 或 3 或 5 输出 = 始终为 0
最佳答案
您永远不应该使用*scanf
家庭,也不atoi
和 friend 。这段代码的正确写法是
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main(void)
{
char inbuf[80], *endp;
unsigned long bet; /* negative bets don't make sense */
puts("What number do you want to bet?");
if (!fgets(inbuf, sizeof inbuf, stdin))
return 1; /* EOF - just quit */
errno = 0;
bet = strtoul(inbuf, &endp, 10);
if (endp == inbuf || *endp != '\n' || errno) {
fputs("invalid number entered, or junk after number\n", stderr);
return 1;
}
printf("Here is your number: %lu\n", bet);
return 0;
}
也许一些说明:
在 C 中读取用户输入的唯一明智的方法是一次读取整行。如果您不这样做,那么当用户输入的输入数量超出您的预期时(而不是如果),您很可能会遇到麻烦。执行此操作的理想方法是使用 getline
,但许多 C 库没有它,它确实让你记得释放行缓冲区。如果失败的话, fgets
对于许多用途来说已经足够了,如此处所示。
在 C 中将文本转换为机器数字的唯一正确方法是使用 strto*
函数族。我非常有意地使用“正确”这个词。所有替代方案要么默默地忽略数字溢出( ato*
),要么更糟糕的是,在数字溢出( *scanf
)时触发未定义的行为。 strto*
的使用模式有点棘手,但是一旦你习惯了,它就只是需要记住和输入的样板文件。我给你拆开:
errno = 0;
需要清除errno
在调用 strto*
之前手动进行,因为溢出返回值范围的语法上有效的数字仅通过设置 errno
来报告。 ,但成功并不明确 errno
。 (手册页说返回一个特定的数值,但该值可能是由正确的输入产生的,所以这没有帮助。)
bet = strtoul(inbuf, &endp, 10);
当该函数调用返回时,bet
将是您想要的号码,并且 endp
将被设置为 inbuf
中的第一个字符这不是一个数字。
if (endp == inbuf || *endp != '\n' || errno) { /* error */ }
如果endp
等于 inbuf
,这意味着没有数字,通常不被视为有效数字。
如果*endp
不等于'\n'
,这意味着数字后面还有其他内容,或 fgets
没有读完整行;无论哪种情况,输入都不会达到预期。 (所有 64 位无符号数字都少于 80 个字符。)
如果 errno
非零,发生数字溢出。
关于在 C 中将输入数字字符串转换为整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22994924/