scanf 时与 char 数组混淆

Posted

技术标签:

【中文标题】scanf 时与 char 数组混淆【英文标题】:Confused with the char array when scanf 【发布时间】:2011-11-08 19:18:12 【问题描述】:

我对一个小程序感到困惑。

#include <stdio.h>

#define LEN 10

int main()

    char str1[LEN] = "\0";
    char str2[LEN] = "\0";

    scanf("%s", str1);
    scanf("%s", str2);

    printf("%s\n", str1);
    printf("%s\n", str2);

    return 0;

如果我的输入是:

芒果巴淘 mangobatao123456

为什么输出应该是:

123456 mangobatao123456

而不是:

芒果巴淘 mangobatao123456

char 数组是如何在内存中分配的?

【问题讨论】:

scanf("%s", str) 本质上是不安全的,除非您完全控制将出现在标准输入上的内容。不管str 多么大,用户可以键入的字符多于它所能容纳的字符,从而导致未定义的行为。 (如果你幸运的话,未定义的行为只有会使你的程序崩溃。) ***.com/questions/9291348/… 【参考方案1】:

好吧,一个 10 个字符的 char 数组不适合 "mangobatao",因为它有 10 个字符 - 没有空终止符的空间。这意味着你已经导致了未定义的行为,所以任何事情都可能发生。

在这种情况下,看起来您的编译器在内存中已经在 str1 之前布局了 str2,因此当您调用 scanf 来填充 str2 时,较长的字符串会覆盖 str1 的开头。这就是为什么您在尝试打印 str1 时看到您认为应该在 str2 中的结尾。如果您使用 100 的长度,您的示例将正常工作。

【讨论】:

【参考方案2】:

我认为您的编译器在 str1 指针之前仅 10 个字符为 str2[10] 分配了空间。

现在,当您在 str2 处扫描长度为 16 的字符串时,字符串终止符 '\0' 将附加在 str2 + 17th 位置,实际上是 str1 + 7。

现在,当您在 str1 处调用 printf 时,读取的字符实际上是 str2 + 11、str2 + 12、...、str2 + 16,直到在 str2 + 17(或 str1 + 7)处遇到空终止符。 str2 处的 printf 必须很明显。

【讨论】:

以上是关于scanf 时与 char 数组混淆的主要内容,如果未能解决你的问题,请参考以下文章

C语言运行问题关于赋值 char scanf的

好玩的加密与解密及char型数组与字符串的相互转化

C语言指针与数组易混淆知识点

在C中扫描整数后扫描char数组

C语言char数组 字符串读入问题

getchar和putchar与scanf和printf的区别