在 C 中将输入数字字符串转换为整数

-1 c string integer

我正在尝试将数字字符串输入转换为整数。当我输入 2 时,我的输出是 0

    scanf( "%d", betNumber );
    printf("What number do you want to bet? \n");
    printf("Here is your number: %d\n" ,atoi(betNumber));
Run Code Online (Sandbox Code Playgroud)

用户输入 = 2 或 3 或 5 输出 = 始终为 0

zwo*_*wol 5

你永远不应该利用*scanf家人,也不应该atoi利用朋友。编写这段代码的正确方法是

#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;
}
Run Code Online (Sandbox Code Playgroud)

也许一些说明:

在 C 中读取用户输入的唯一明智的方法是一次读取整行。如果您不这样做,那么当用户输入的输入数量超出您的预期时(而不是如果),您很可能会遇到麻烦。执行此操作的理想方法是使用getline,但许多 C 库没有它,并且它确实让您记住释放行缓冲区。如果做不到这一点,fgets对于许多目的来说已经足够了,如此处所示。

在 C 中将文本转换为机器数字的唯一正确strto*方法是使用函数系列。我非常刻意地使用“正确”这个词。所有替代方案要么默默地忽略数字溢出 ( ato*),要么更糟糕的是,在数字溢出 ( ) 上触发未定义的行为*scanf。的使用模式strto*有点棘手,但是一旦你习惯了它,它就只是需要记住和输入的样板文件。我给你拆开:

errno = 0;
Run Code Online (Sandbox Code Playgroud)

errno调用前需要手动清除strto*,因为语法上有效的超出返回值范围的数字只能通过设置报告errno,但成功并不清除errno。(手册页说返回一个特定的数值,但该值可能是由正确的输入产生的,所以这没有帮助。)

bet = strtoul(inbuf, &endp, 10);
Run Code Online (Sandbox Code Playgroud)

当此函数调用返回时,bet将是您想要的数字,并将endp被设置inbuf为非数字的第一个字符。

if (endp == inbuf || *endp != '\n' || errno) { /* error */ }
Run Code Online (Sandbox Code Playgroud)

如果endp等于inbuf,则意味着没有数字,这通常不被视为有效数字。

如果*endp不等于'\n',则意味着数字后面的行上还有其他内容,或者 fgets没有读取整行;无论哪种情况,输入都不会达到预期。(所有 64 位无符号数字都少于 80 个字符。)

如果errno非零,则发生数字溢出。