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

标签 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));

用户输入 = 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/

相关文章:

JAVA - 将 "Stringed"数组解析为实际数组

java - Spring bean 整数注入(inject)失败

带整数的 C++ boolean 值

c - 在c中执行汇编代码

c - 如何在 C 语言中按 ASCII 顺序对命令行参数进行排序

c++ - 使用Vector函数C++从文件中读取特定数据

python - 将字符串转换为二维 numpy 数组

c - 在 C 中,是否保证 1/2 == 0?

c++ - printf 跳过字符数组的第一个字符

C- 对 <函数名称> 的 undefined reference