我遇到了麻烦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:为什么?
您正在将字符串复制到未初始化的指针(a).您需要为它分配存储(with malloc),或声明一个数组.
当您不分配任何存储时,实现有时似乎可以正常工作.当您指定NULL时a,sscanf无法存储任何内容,因此您尝试使用NULL指针(printf打印为(null))打印"字符串" .在某些系统上,您的程序会崩溃.
有一个编译器/库扩展允许自动分配字符串,但显然这不是可移植的,并非所有编译器都支持它.
char *a;
scanf("%ms", &a;) // allocates storage for a
Run Code Online (Sandbox Code Playgroud)
您可以将未初始化的指针传递给该函数,但请注意&.