scanf()无法正常工作?

时间:2013-09-28 16:26:26

标签: c scanf

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

输出: 运行时检查失败#3 str正在使用而未被初始化

5 个答案:

答案 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 *strstr声明为指向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中增加更多概念。