【问题标题】:C - Inputting string into an int variable?C - 将字符串输入到 int 变量中?
【发布时间】:2013-07-21 08:35:41
【问题描述】:

在下面的代码中,

#include <stdio.h>
int main()
{
    int i = 5;
    scanf("%s", &i);
    printf("%d\n", i);
    return 0;
}

我获取存储在i 地址的输入字符串。当我尝试打印变量i 时,我得到了一些数字。

输入示例:

hello

输出:

1819043176

这是什么数字,到底发生了什么?

【问题讨论】:

标签: c int scanf


【解决方案1】:

该程序将从用户读取的字符串写入变量 i 占用的内存中并传递过去。由于这是未定义的行为,任何事情都可能发生。

实际发生的情况是,在您的机器上int 的大小为 4 chars,而字符“hell”在转换为 ASCII 并解释为 CPU 字节顺序中的数字时,结果是是数字 1819043176。字符串的其余部分,字母 o 和终止的 nul 字符,都超出了 i 存储在您机器上的位置的末尾。那么scanf 所做的是这样的:

  h  e  l  l  o \0
|68 65 6c 6c|6f 00 ...
|          i|memory past i

您似乎在小端机器上运行它,因此当字节 68 65 6c 6c 存储到 int 中时,它被解释为数字 0x6c6c6568,或十进制的 1819043176

如果int 的大小不同,或者机器使用了另一个字符集(例如 EBCDIC 而不是 ASCII),或者 CPU 使用了大端字节序,或者程序在内存写入的环境中运行边界检查,你会得到不同的结果或程序崩溃。简而言之,未定义的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多