我遇到了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);
}
我得到正确的输出:
sscanf: 1
a: /something
sscan: 1
a: /more
但是当我评论空白评论之间的界线时,我得到:
sscan: 0
a: (null)
问题1 :怎么会这样?
还有一点:如果我写char *a = NULL
,我得到:
sscanf: 0
a: (null)
sscan: 0
a: (null)
问题2 :为什么?
答案 0 :(得分:5)
您正在将字符串复制到未初始化的指针(a
)。您需要为其分配存储(使用malloc
),或声明一个数组。
当您不分配任何存储空间时,实现有时似乎可以正常工作。当您为a
分配NULL时,sscanf
无法存储任何内容,因此您尝试使用NULL指针(printf
打印为(null)
)打印“字符串” 。在某些系统上,您的程序会崩溃。
有一个编译器/库扩展允许自动分配字符串,但显然这不是可移植的,并非所有编译器都支持它。
char *a;
scanf("%ms", &a;) // allocates storage for a
您可以将未初始化的指针传递给该函数,但请注意&
。
答案 1 :(得分:2)
您正在将未初始化的指针传递给sscanf。将char *a;
更改为char a[100]
,它应该可以正常运行。
答案 2 :(得分:0)
您正在将数据写入未分配的空间。 char *a;
只是指向随机内存的指针。在尝试将数据放入“字符串”后,您将调用未定义的行为,并且可能发生任何事情。
答案 3 :(得分:0)
嗯,我认为,在我的案例中唯一正确的是:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
main(){
char *s = strdup("GET /something HTTP/1.1\r\n");
char *a, *e, *ans;
char *end = s + strlen(s);
a = strstr(s, "GET");
if(!a) return -1;
a += 4;
if(a >= end) return -1;
e = strstr(a, "HTTP/1.1");
if(!e) return -1;
*(--e) = 0;
ans = strdup(a);
printf("ans: %s\n", ans);
}
通常情况下,字符串s
的大小可能非常大,因此最好不要分配太多内存,而是根据需要分配权限。
“%as”的情况不适用于我的gcc(4.7.2)。