scanf 内存分配错误
memory allocation error with scanf
我有这个简单的代码,但不知道如何为 scanf 分配内存
char* string= (char*) malloc (sizeof(char));
printf("insert string: \n");
scanf("%s", string);
free(string);
无论我的字符串有多少个字符,都是错误。我想为 char* 使用 malloc,为 scanf 设置内存的任何方式。
你只是请求1个字节。如果你想存储的不仅仅是字符串中的 0
终止符,你需要分配更多:
char* string= malloc (256); //256 bytes, arbitrary value...
我删除了:
sizeof(char)
因为它总是保证 1
.
(char*)
因为转换 malloc()
is needless 的 return 值。
我还建议使用 fgets()
而不是 scanf()
来防止缓冲区溢出。通过在格式字符串中指定长度,可以对 scanf()
完成相同的操作。但我个人更喜欢在必要时使用 fgets()
and parsing using sscanf()
。
尝试
char buf[256];
scanf( "%s" , buf);
删除你的 malloc。
您正在为可能是可变大小的字符串数组分配一小块内存。默认情况下,一个数组只是一个指向 buf[0] 的指针,这是字符串将给它的内容。您需要一个缓冲区来捕获初始读取,然后分配适当的内存。
之后你可以做 string = length(buf) * sizeof(char) <- 伪代码
分配正确的字符串长度。
正如@Blue Moon 正确指出的那样,您只是分配内存来存储一个字符,而单个字符唯一可以存储的字符串是空字符串或没有字符的字符串。在 C 中,所有字符串都以空字符结尾,您分配的 1 个字节的内存只能容纳一个空字符,即 '\0'
为了在字符串中存储更多的字符,比如一百个字符,您可以执行以下操作:
#define MAX_STRING_SIZE 102
char* string= (char*) malloc (sizeof(char) * MAX_STRING_SIZE);
memset(string, '[=10=]', MAX_STRING_SIZE);
printf("Insert string: \n");
scanf("%101s", string);
if (strlen(string) == (MAX_STRING_SIZE - 1))
{
printf("The user entered a string larger than 100 characters!");
free(string);
/****Error handling***/
}
/*****Do something with string****/
free(string)
上面的代码片段是一个很好的小技巧,可以判断用户输入的字符数是否有效。如果您希望用户最多输入 100 个字符,并且您的程序在理想情况下总是 运行(用户一直在听您说话并且从不输入超过 100 个字符),您只需要一个额外的字节存储空字符。因此,101 个字符需要 space。但是您可以为另一个字符添加 space,并分配 102 个字节,以找出用户输入超过 100 个字符的字符串的情况。
工作原理:假设用户输入了 100 多个字符。 scanf 函数最多可以读取 101 个字符。所以,我们可以使用strlen函数来判断用户输入的字符数是否等于101,这样可以帮助我们验证输入的字符串。
我有这个简单的代码,但不知道如何为 scanf 分配内存
char* string= (char*) malloc (sizeof(char));
printf("insert string: \n");
scanf("%s", string);
free(string);
无论我的字符串有多少个字符,都是错误。我想为 char* 使用 malloc,为 scanf 设置内存的任何方式。
你只是请求1个字节。如果你想存储的不仅仅是字符串中的 0
终止符,你需要分配更多:
char* string= malloc (256); //256 bytes, arbitrary value...
我删除了:
sizeof(char)
因为它总是保证1
.(char*)
因为转换malloc()
is needless 的 return 值。
我还建议使用 fgets()
而不是 scanf()
来防止缓冲区溢出。通过在格式字符串中指定长度,可以对 scanf()
完成相同的操作。但我个人更喜欢在必要时使用 fgets()
and parsing using sscanf()
。
尝试
char buf[256];
scanf( "%s" , buf);
删除你的 malloc。 您正在为可能是可变大小的字符串数组分配一小块内存。默认情况下,一个数组只是一个指向 buf[0] 的指针,这是字符串将给它的内容。您需要一个缓冲区来捕获初始读取,然后分配适当的内存。
之后你可以做 string = length(buf) * sizeof(char) <- 伪代码
分配正确的字符串长度。
正如@Blue Moon 正确指出的那样,您只是分配内存来存储一个字符,而单个字符唯一可以存储的字符串是空字符串或没有字符的字符串。在 C 中,所有字符串都以空字符结尾,您分配的 1 个字节的内存只能容纳一个空字符,即 '\0'
为了在字符串中存储更多的字符,比如一百个字符,您可以执行以下操作:
#define MAX_STRING_SIZE 102
char* string= (char*) malloc (sizeof(char) * MAX_STRING_SIZE);
memset(string, '[=10=]', MAX_STRING_SIZE);
printf("Insert string: \n");
scanf("%101s", string);
if (strlen(string) == (MAX_STRING_SIZE - 1))
{
printf("The user entered a string larger than 100 characters!");
free(string);
/****Error handling***/
}
/*****Do something with string****/
free(string)
上面的代码片段是一个很好的小技巧,可以判断用户输入的字符数是否有效。如果您希望用户最多输入 100 个字符,并且您的程序在理想情况下总是 运行(用户一直在听您说话并且从不输入超过 100 个字符),您只需要一个额外的字节存储空字符。因此,101 个字符需要 space。但是您可以为另一个字符添加 space,并分配 102 个字节,以找出用户输入超过 100 个字符的字符串的情况。
工作原理:假设用户输入了 100 多个字符。 scanf 函数最多可以读取 101 个字符。所以,我们可以使用strlen函数来判断用户输入的字符数是否等于101,这样可以帮助我们验证输入的字符串。