scanf() 如何处理 C99 中的字符串?

How does scanf() work for strings in C99?

所以我正在制作学习 C 语言的纪录片,我想在指针和输入中制作示例。基本上,我用 C99 做了一个这样的 Hello, (name). 程序:

#include <stdio.h>

int main() {
    char *name;
    printf("What's your name? ");
    scanf("%s", name);
    printf("Hello, %s.\n", name);
}

当我尝试编译它时,它给我的错误是这样的:

C3.c:5:48: error: variable 'name' is uninitialized when used here [-Werror,-Wuninitialized]
    printf("What is your name? "); scanf("%s", name);
                                               ^~~~
C3.c:4:17: note: initialize the variable 'name' to silence this warning
    char *name;
               ^
                = NULL
1 error generated.
<builtin>: recipe for target 'C3' failed
make: *** [C3] Error 1

所以我将第2行修改为char *result = "";,这次真的成功了,但是输出是这样的:

What's your name? Bro
Segmentation fault

这让我有点困惑,因为我实际上并不习惯 scanf() 功能。

所以我的问题是,在 C99 中使用 scanf() 通过输入获取字符串而之后没有任何奇怪输出的更好方法是什么?

scanf 不分配任何内存。您需要自己分配字符串的内存。您还应该指定允许读取的长度 scanf 以避免缓冲区溢出。

例如:

char name[21]; // 20 chars plus the null-terminator
printf("What's your name? ");
scanf("%20s", name);