sscanf与字符串的奇怪行为

时间:2013-03-14 15:53:51

标签: 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);
}

我得到正确的输出:

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 :为什么?

4 个答案:

答案 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)。