【问题标题】:scanf() not working properly?scanf() 不能正常工作?
【发布时间】:2013-09-28 16:26:26
【问题描述】:
  char *str;
  printf("Enter string:\n");
  scanf("%s",str);

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

【问题讨论】:

  • 您正在尝试将数据读入未初始化指针指向的内存位置?
  • 奇怪的是,每个人都认为'需要一个字符串;使用malloc()' 而不是'需要一个字符串;声明一个数组'。阵列更易于管理;没有人提醒你需要free()malloc()分配的东西,也没有提醒你需要检查malloc()的返回值。

标签: c scanf


【解决方案1】:

分配一个数组并读入:

char str[100];

if (scanf("%99s", str) != 1)
    ...error...

或者,如果你需要一个指针,那么:

char data[100];
char *str = data;

if (scanf("%99s", str) != 1)
    ...error...

注意使用长度来防止缓冲区溢出。请注意,指定给 scanf() 等人的长度比总长度小一(基于古代先例的奇怪现象;大多数代码都包含指定长度的空字节 - 例如,请参见 fgets())。

请记住,%s 将跳过前导空格,然后在某个非空格字符之后的第一个空格处停止。特别是,它将在输入流中保留换行符,为下一个输入操作读取做好准备。如果您想要整行输入,那么您可能应该使用fgets()sscanf() 而不是原始scanf() — 实际上,您通常应该使用fgets()sscanf() 而不是scanf() 或@ 987654332@,如果只是因为它使报告一个很多的合理错误变得更容易。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 内存分配只是为了让用户输入:-/,R.I.P C 语言
    • BOX 中没有足够的空间。你怎么能在里面放一些额外的东西。分配内存只不过是创造一些空间
    • 为什么在地球上你会malloc 这个而不是声明一个数组?这是专门为了让您以后忘记free吗?请不要这样做!
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        在给指针赋值之前,你必须先分配内存。永远记住,指针指向一个内存位置,你必须告诉他你想为他分配的内存位置。因此,为此,您必须这样做:

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

        这将为您分配 1 个字节的内存块。因此,您只能在此内存块中分配一个字符。对于字符串,您必须根据字符串中的字符数分配尽可能多的块。例如,“堆栈”需要 5 个字符和 1 个额外的块用于 '\0'。所以,你必须给他分配至少6个内存块。

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

        我希望这将帮助您在 C 中发展更多概念。

        【讨论】:

        • 你不应该描述如何使用malloc而不描述如何使用free,并解释为什么一个人必须始终陪伴另一个人。如果您不这样做,阅读您的答案的初学者将会去创建他们自己的内存泄漏。确实,在这种情况下,使用数组是一个更好的解决方案。
        猜你喜欢
        • 2020-07-15
        • 1970-01-01
        • 1970-01-01
        • 2021-01-25
        • 2013-03-30
        • 2010-11-30
        • 2021-10-02
        • 2017-08-06
        • 2013-11-22
        相关资源
        最近更新 更多