提问人:hina abbasi 提问时间:9/29/2013 更新时间:9/29/2013 访问量:1163
scanf() 工作不正常?
scanf() not working properly?
答:
如果您不初始化它,它是一种未定义的行为。您有一个未初始化的指针,该指针正在将数据读取到内存位置,这最终可能会给您带来麻烦。您已声明为指针,但尚未为其提供指向的有效位置;它最初包含一些随机值,这些值可能是也可能不是可写内存地址。尝试将内存分配给 char *str;str
char *str = malloc(sizeof(char)*100);
评论
malloc
free
char *str
声明为指向类型的指针。 将仅从输入的字符串中读取。str
char
scanf("%s",str)
E
您可能不想完全使用(或养成使用它的习惯),因为它容易受到缓冲区溢出的影响(即可能接受的字符数可能超过缓冲区可以容纳的字符数)。有关此内容的讨论,请参阅 scanf 的缺点scanf("%s")
分配一个数组并读入其中:
char str[100];
if (scanf("%99s", str) != 1)
...error...
或者,如果您需要指针,则:
char data[100];
char *str = data;
if (scanf("%99s", str) != 1)
...error...
请注意,使用长度来防止缓冲区溢出。请注意,指定给 et al 的长度比总长度小 1(基于古代先例的奇怪现象;大多数代码在指定长度中包含空字节 — 例如,参见 )。scanf()
fgets()
请记住,这将跳过前导空格,然后在一些非空格字符之后的第一个空格上停止。特别是,它会将换行符保留在输入流中,以便下一个输入操作读取。如果你想要整行输入,那么你可能应该使用 and 而不是 raw——事实上,很多时候你应该使用 and 而不是 or ,如果只是因为它使合理的错误报告变得容易得多。%s
fgets()
sscanf()
scanf()
fgets()
sscanf()
scanf()
fscanf()
在为指针分配某些值之前,必须分配内存。永远记住,指针指向一个内存位置,你必须告诉他你想为他分配什么内存位置。因此,要做到这一点,您必须执行以下操作:
str = (char*)malloc(sizeof(char));
这将为您分配 1 字节的内存块。因此,您只能在此内存块中分配一个字符。对于字符串,您必须根据字符串中的字符数分配尽可能多的块。比如说,“Stack”需要 5 个字符和 1 个额外的块来表示“\0”。因此,您必须为他分配至少 6 个内存块。
str = (char*)malloc(6*sizeof(char));
我希望这能帮助你在 C 语言中发展更多的概念。
评论
malloc
free
评论
malloc()
free()
malloc()
malloc()