gpt4 book ai didi

c - 获取预定义字符串的长度与从输入获取字符串的长度

转载 作者:行者123 更新时间:2023-11-30 20:49:45 25 4
gpt4 key购买 nike

我似乎无法理解为什么这两种情况表现不同:

const char* TEXT = "hello world!";
int length = (int) strlen(TEXT);
char* array[length];

这没关系,但是这个:

char* text;
scanf("%[^\n]s", text);
// input "hello world!" and press enter
int length = (int) strlen(text);
char* array[length];

以段错误结束

我错过了什么?

最佳答案

对于 scanf 调用的 text 参数,您不分配任何内存。您也不会将变量初始化为值。这会导致 scanf 写入随机内存,从而导致段错误。

要解决此问题,您需要分配合理大小的缓冲区:

char* text = malloc(1024);

1024 是您期望输入数据的最大大小。然而,这仍然使代码容易受到缓冲区溢出的影响。为了防止缓冲区溢出,您可以通知 scanf text 具有一定的大小;寻找答案here

如果您不想自己分配内存,scanf可以为您完成:


Note that the POSIX 2008 (2013) version of the scanf() family of functions supports a format modifier m (an assignment-allocation character) for string inputs (%s, %c, %[). Instead of taking a char * argument, it takes a char ** argument, and it allocates the necessary space for the value it reads:

char *buffer = 0;
if (sscanf(data, "%ms", &buffer) == 1)
{
printf("String is: <<%s>>\n", buffer);
free(buffer);
}

If the sscanf() function fails to satisfy all the conversion specifications, then all the memory it allocated for %ms-like conversions is freed before the function returns.

关于c - 获取预定义字符串的长度与从输入获取字符串的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58590680/

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