gpt4 book ai didi

C 任意长度字符串

转载 作者:行者123 更新时间:2023-12-03 18:32:12 26 4
gpt4 key购买 nike

我怀疑数组的长度是如何分配的

#include <stdio.h>
#include <string.h>

int main()
{
char str[] = "s";
long unsigned a = strlen(str);
scanf("%s", str);
printf("%s\n%lu\n", str, a);
return 0;
}

在上面的程序中,我将字符串 "s" 分配给 char 数组。
我认为 str[] 的长度是 1。所以我们不能存储超过数组的长度。但它的行为不同。如果我使用 scanf 读取字符串,它将存储在 str[] 中而没有任何错误。 str 数组的长度是多少?

示例输入/输出:
Hello

Hello 1

最佳答案

您的 str 是一个用 char 初始化的 "s" 数组,也就是说,它的大小为 2 ,长度为 1 。大小比长度大 1,因为在末尾添加了 NUL 字符串终止符 ( \0 )。

您的 str 数组最多可以容纳两个 char 。尝试写入更多内容将导致您的程序访问超出数组末尾的内存,这是未定义的行为。

但实际发生的情况是,由于 str 数组存储在内存中的某个位置(在堆栈上),并且该内存区域远大于 2 个字节,因此您实际上可以写到末尾而不会导致崩溃。这确实 而不是 意味着您应该这样做。它仍然是未定义的行为。

由于数组的大小为2,因此只能容纳长度为1的字符串以及其终止符。要使用 scanf() 并正确避免写入数组末尾,您可以使用字段宽度说明符:% 之后和 s 之前的数值,如下所示:

scanf("%1s", str);

关于C 任意长度字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61614297/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com