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