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は非常に大きなサイズになる可能性があるため、多くのメモリを割り当てるのではなく、必要に応じて適切に割り当てることをお勧めします。

私の gcc (4.7.2) では、"%as" のケースが機能しません。

于 2013-03-14T16:30:18.220 に答える
0

未割り当て領域にデータを書き込んでいます。char *a;は、ランダム メモリへのポインタにすぎません。「文字列」にデータを入れようとすると、未定義の動作が呼び出され、何かが起こる可能性があります。

于 2013-03-14T15:57:36.380 に答える