0

我遇到了麻烦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

4 回答 4

5

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

当您不分配任何存储空间时,实现有时会正常工作。当您将 NULL 分配给 时asscanf无法存储任何内容,因此您尝试使用 NULL 指针打印“字符串”(printf打印为(null))。在某些系统上,您的程序只会崩溃。

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

char *a;
scanf("%ms", &a;) // allocates storage for a

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

于 2013-03-14T15:58:02.677 回答
2

您正在将未初始化的指针传递给 sscanf。更改char *a;char a[100],它应该可以正常工作。

于 2013-03-14T15:57:51.730 回答
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)。

于 2013-03-14T16:30:18.220 回答
0

您正在将数据写入未分配的空间。char *a;只是一个指向随机内存的指针。在您尝试将数据放入“字符串”后,您会调用未定义的行为,并且任何事情都可能发生。

于 2013-03-14T15:57:36.380 回答