我想读取用户的输入并保存。我现在拥有的工作正常,但是我需要知道scanf的合法性(遵循ansi标准-c90)是scanf在为输入分配内存之前首先分配了变量“ length”,还是仅是编译器的一个怪癖。
#include <stdio.h>
int main()
{
char* text;
int length = 0;
scanf("%s%n", text = malloc(length+1), &length);
printf("%s", text);
return 0;
}
这将无法正常工作。
在您呼叫时malloc
,length
其值仍为0,因此您只分配了一个字节。length
直到scanf
返回后才更新。因此,任何非空字符串都将超出分配的缓冲区的边界写入,从而调用undefined behavior。
尽管并不完全相同,但是您可以使用use getline
,前提是您正在POSIX系统(例如Linux)上运行。此函数读取一行文本(包括换行符)并为该行分配空间。
char *text = NULL;
size_t n = 0;
ssite_t rval = getline(&text, &n, stdin);
if (rval == -1) {
perror("getline failed");
} else {
printf("%s", text);
}
free(text);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句