scanf() 工作不正常?

scanf() not working properly?

提问人:hina abbasi 提问时间:9/29/2013 更新时间:9/29/2013 访问量:1163

问:

  char *str;
  printf("Enter string:\n");
  scanf("%s",str);

输出: 运行时检查失败#3 STR 在未初始化的情况下被使用

c 扫描

评论

0赞 AnT stands with Russia 9/29/2013
您正在尝试将数据读入未初始化指针指向的内存位置?
3赞 Jonathan Leffler 9/29/2013
奇怪的是,每个人都认为“需要一根绳子;使用 ' 而不是 'need a string;声明一个数组'。阵列更易于管理;没有人提醒您需要通过 分配的内容,也没有人提醒您需要检查 的返回值。malloc()free()malloc()malloc()

答:

1赞 Rahul Tripathi 9/29/2013 #1

如果您不初始化它,它是一种未定义的行为。您有一个未初始化的指针,该指针正在将数据读取到内存位置,这最终可能会给您带来麻烦。您已声明为指针,但尚未为其提供指向的有效位置;它最初包含一些随机值,这些值可能是也可能不是可写内存地址。尝试将内存分配给 char *str;str

char *str = malloc(sizeof(char)*100);

评论

0赞 hina abbasi 9/29/2013
内存分配只是为了让用户输入:-/, R.I.P C 语言
0赞 Gangadhar 9/29/2013
盒子里没有足够的空间。你怎么能把一些额外的东西放进去,分配内存只不过是创造一些空间
0赞 Dawood ibn Kareem 4/10/2014
为什么你会这样做而不是声明一个数组?这是专门为了让你以后忘记它吗?请不要这样做!mallocfree
0赞 haccks 9/29/2013 #2

char *str声明为指向类型的指针。 将仅从输入的字符串中读取。strcharscanf("%s",str)E

0赞 halfbit 9/29/2013 #3

您可能不想完全使用(或养成使用它的习惯),因为它容易受到缓冲区溢出的影响(即可能接受的字符数可能超过缓冲区可以容纳的字符数)。有关此内容的讨论,请参阅 scanf 的缺点scanf("%s")

3赞 Jonathan Leffler 9/29/2013 #4

分配一个数组并读入其中:

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 ,如果只是因为它使合理的错误报告变得容易得多%sfgets()sscanf()scanf()fgets()sscanf()scanf()fscanf()

0赞 Tonmoy 9/29/2013 #5

在为指针分配某些值之前,必须分配内存。永远记住,指针指向一个内存位置,你必须告诉他你想为他分配什么内存位置。因此,要做到这一点,您必须执行以下操作:

str = (char*)malloc(sizeof(char));

这将为您分配 1 字节的内存块。因此,您只能在此内存块中分配一个字符。对于字符串,您必须根据字符串中的字符数分配尽可能多的块。比如说,“Stack”需要 5 个字符和 1 个额外的块来表示“\0”。因此,您必须为他分配至少 6 个内存块。

str =  (char*)malloc(6*sizeof(char));

我希望这能帮助你在 C 语言中发展更多的概念。

评论

0赞 Dawood ibn Kareem 4/10/2014
你不应该在描述如何使用时不描述如何使用,并解释为什么一个必须始终伴随着另一个。如果你不这样做,阅读你的答案的初学者会去创造他们自己的内存泄漏。实际上,在这种情况下,使用数组是一个更好的解决方案。mallocfree