将字符串转换为数字

标签 c

我遇到了这个 C 程序:

int main() {
    printf("Enter your address, (e.g. 51 Anzac Road) ");
    gets(address);
    number = 0;
    i = 0;
    while (address[i] != ' ') {
        number = number * 10 + (address[i] - 48);
        i++;
    }
}

我理解 number = number * 10 + (address[i] - 48); 是从输入中获取数字,但有人可以向我解释这是如何工作的吗?它如何根据输入生成数字?

最佳答案

C 要求数字 09 以该顺序连续存储在执行字符集中。 48'0' 的 ASCII 值,例如:

'3' - 48 == 3

对于任何数字。

C 不需要 ASCII,所以更好的是:

'3' - '0' 

因为 48 适用于 ASCII,而 '0' 根据定义适用于任何字符集。

如果 address 包含 "456 ",则:

  • i == 0number == 0 时,number * 10 + (address[0] - 48) 等于 0 * 10 + 4,或 4
  • i == 1 时,number * 10 + (address[1] - 48)4 * 10 + 5,或者45
  • i == 2 时,number * 10 + (address[2] - 48)45 * 10 + 6,或者456

你就完成了。

永远不要使用 gets(),它很危险,甚至不再是 C 的一部分。

关于将字符串转换为数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26227476/

相关文章:

C+Fortran 为什么使用 sigsegv?

iphone - Objective C 将网页显示为 UITableView 的子类

c - C中的并行编程

c - 将 C for 循环转换为 Pascal

c++ - 我怎样才能让 Doxygen 知道 CUDA 内核调用?

c - 在 Bison 中拆分语法规则

c - 如何通过单个 Makefile 使用不同的标志组合自动编译代码

c - 错误 C2057 : expected constant expression in vs2008

c - 在 C 中直接将函数的返回(和调用)作为另一个参数传递

c - 扫描调用进程的内存