【问题标题】:What's wrong with this scanf()?这个scanf()有什么问题?
【发布时间】:2013-06-03 16:56:35
【问题描述】:

我是否以某种错误的方式使用了 scanf()?

char *input;
scanf("%s", input);
printf("%s\n", input);

这在运行时失败。

【问题讨论】:

    标签: c char scanf


    【解决方案1】:

    声明char * 只会创建一个指针,它不会为字符串分配任何内存。您需要为输入分配内存。您可以通过malloc(以及free 完成后)动态地执行此操作,或者您可以声明一个静态大小的数组,如char input[100]

    【讨论】:

    • 如果我事先不知道字符串的大小,我该如何使用 malloc()?
    • 你需要假设一些最大尺寸。或者,如果无法假设最大大小,那么您可以在循环中逐块读取,例如读取 1000 个字符的块并将其附加到缓冲区,然后再读取下一个 1000 个字符的块,并继续这样直到结束。
    • 这就是为什么scanf() 不安全,至少在传统上是这样。这个link 讨论了一些克服这个问题的方法。
    • @n3rd4n1,是的,没有边界检查的输入是有风险的。同理,fgetsgets 更可取。
    • @taskinoor 如果我能做到你刚才所说的,我就不会在这里问这么基本的问题。
    【解决方案2】:
    char *input;
    

    这是一个指针。它不指向任何内存。

    #include <stdlib.h>
    #include <stdio.h>
    
    int main()
    {
        //char *input;
        char input[128];
        memset(input, 0 ,sizeof(input));
        scanf("%s", input);
        printf("%s\n", input);
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      char *input; 替换为char input[1024] = {0};

      您应该确保传递给 scanf 的参数指向可以保存您的输入的缓冲区

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-26
        • 2021-08-20
        • 2015-09-23
        • 2021-02-27
        • 2012-03-10
        • 2010-11-01
        • 2011-08-26
        • 2020-04-16
        相关资源
        最近更新 更多