sscanf与字符串的奇怪行为

Edd*_*_Em 0 c scanf

我遇到了麻烦sscanf.为了检查它我做了一个简单的文件,所以当我编译它时:

#include <stdio.h>
main(){
    char *a;
    /* */
    char *s = "GET /something HTTP/1.1\r\n";
    printf("sscanf: %d\n", sscanf(s, "GET %s HTTP", a));
    printf("a: %s\n", a);
    /* */
    printf("sscan: %d\n", sscanf("GET /more HTTP/1.1\r\n", "GET %s HTTP", a));
    printf("a: %s\n", a);
}
Run Code Online (Sandbox Code Playgroud)

我输出正确:

sscanf: 1
a: /something
sscan: 1
a: /more
Run Code Online (Sandbox Code Playgroud)

但当我评论空白评论之间的界限时,我得到:

sscan: 0
a: (null)
Run Code Online (Sandbox Code Playgroud)

问题1:怎么会这样?

还有一点:如果我写char *a = NULL,我得到:

sscanf: 0
a: (null)
sscan: 0
a: (null)
Run Code Online (Sandbox Code Playgroud)

问题2:为什么?

tep*_*pic 5

您正在将字符串复制到未初始化的指针(a).您需要为它分配存储(with malloc),或声明一个数组.

当您不分配任何存储时,实现有时似乎可以正常工作.当您指定NULL时a,sscanf无法存储任何内容,因此您尝试使用NULL指针(printf打印为(null))打印"字符串" .在某些系统上,您的程序会崩溃.

有一个编译器/库扩展允许自动分配字符串,但显然这不是可移植的,并非所有编译器都支持它.

char *a;
scanf("%ms", &a;) // allocates storage for a
Run Code Online (Sandbox Code Playgroud)

您可以将未初始化的指针传递给该函数,但请注意&.