scanf 时与 char 数组混淆

发布于 2024-12-02 17:00:08 字数 539 浏览 1 评论 0原文

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

#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;
}

如果我的输入是:

芒果巴涛
芒果巴涛123456

为什么输出应该是:

123456
芒果巴涛123456

而不是:

芒果巴涛
芒果巴涛123456

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

I am confused with one tiny program.

#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;
}

If my input are:

mangobatao
mangobatao123456

Why should the output be:

123456
mangobatao123456

And not:

mangobatao
mangobatao123456

How has the char array has been allocated in the memory?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梦途 2024-12-09 17:00:08

嗯,10 个字符的 char 数组不适合 "mangobatao",因为它有 10 个字符 - 没有空间容纳 null 终止符。这意味着您导致了未定义的行为,因此任何事情都可能发生。

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

Well, a 10 character char array won't fit "mangobatao", since it has 10 characters - there's no room for the null terminator. That means you've caused undefined behaviour, so anything could happen.

In this case, it looks like your compiler has laid out str2 before str1 in memory, so when you call scanf to fill str2, the longer string overwrites the beginning of str1. That's why you see the end of what you think should be in str2 when trying to print str1. Your example will work fine if you use a length of 100.

蓝海 2024-12-09 17:00:08

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

现在,当你在str2处scanf一个长度为16的字符串时,字符串终止符'\0'被附加在str2+第17个位置,这实际上是str1+7。

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

I think your compiler has allocated space for str2[10] just 10 characters before the str1 pointer.

Now, when you scanf a string of length 16 at str2, the string terminator '\0' is appended at str2 + 17th position, which is infact str1 + 7.

Now when you call printf at str1, the characters read are actually str2 + 11, str2 + 12,..., str2 + 16 until the null terminator is encountered at str2 + 17 (or str1 + 7).
The printf at str2 must be obvious.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文