char *str;
printf("Enter string:\n");
scanf("%s",str);
输出:运行时检查失败#3 str 正在使用而未初始化
分配一个数组并读入:
char str[100];
if (scanf("%99s", str) != 1)
...error...
或者,如果你需要一个指针,那么:
char data[100];
char *str = data;
if (scanf("%99s", str) != 1)
...error...
注意使用长度来防止缓冲区溢出。请注意,指定给scanf()
et al 的长度比总长度小 1(基于古代先例的奇怪现象;大多数代码都包含指定长度的空字节 -fgets()
例如,请参阅 )。
请记住,这%s
将跳过前导空格,然后在某个非空格字符之后的第一个空格处停止。特别是,它将在输入流中保留换行符,为下一个输入操作读取做好准备。如果您想要整行输入,那么您可能应该使用fgets()
andsscanf()
而不是 raw scanf()
- 事实上,您经常应该使用fgets()
andsscanf()
而不是scanf()
or fscanf()
,如果只是因为它使合理的错误报告更容易。
如果你不初始化它,它是一个未定义的行为。你有一个未初始化的指针,它正在将数据读入内存位置,这最终可能会给你带来麻烦。你已经声明str
为一个指针,但你没有给它一个有效的指向位置;它最初包含一些可能是也可能不是可写内存地址的随机值。尝试将内存分配给 char *str;
char *str = malloc(sizeof(char)*100);
char *str
声明str
为char
类型的指针。scanf("%s",str)
将只E
从输入的字符串中读取。
您可能不想完全使用scanf("%s")
(或养成使用它的习惯),因为它容易受到缓冲区溢出的影响(即,可能接受的字符数可能超出缓冲区的容量)。有关此问题的讨论,请参见Scanf 的缺点
在为指针分配一些值之前,您必须分配内存。永远记住,指针指向一个内存位置,你必须告诉他你想为他分配的内存位置。因此,为此,您必须这样做:
str = (char*)malloc(sizeof(char));
这将为您分配 1 个字节的内存块。因此,您只能在此内存块中分配一个字符。对于字符串,您必须根据字符串中的字符数分配尽可能多的块。例如,“堆栈”需要 5 个字符和 1 个额外的块用于 '\0'。因此,您必须为他分配至少 6 个内存块。
str = (char*)malloc(6*sizeof(char));
我希望这将帮助您在 C 中发展更多概念。