-1

文字と数字を含むファイルから文字列を解析して typedef 構造にする方法を教えてください。

これらの 2 行は、解析する必要があるデータの例です。

Pebbles Flintstone4Female
Bam-Bam Rubble3Male

最初に名前、次にスペース、次に姓、次に年齢と性別です。

名前、姓、年齢、および性別は、これを格納する必要がある typedef の一部です。

.txt ファイルには、上記の 2 つのような合計 7 つの文字列が格納されています。

文字列を分離するための正しいバッファを作成するにはどうすればよいですか?

これは私がこれまでに得たものです

sscanf(buffer, "%[^ ]%*[^1234567890]%d%s", buff_name, buff_surname, buff_age, buff_gender);

しかし、正しく動作していないようで、それに関する情報にアクセスできません。

4

1 に答える 1

3
  1. sscanf()とその親戚からの戻り値を常にチェックしてください。
  2. コンパイラの警告を有効にしてください。優れたコンパイラは、次の問題について教えてくれます。
  3. 姓を読み上げたい場合は、 *inを使用して割り当てを抑制しないでください。%*[0-9]

sscanf()あなたの行はあなたが言及したデータ構造を使用していないことに注意してください。ただし、このサンプル コードは次のことを行います。

#include <stdio.h>

typedef struct who
{
    char name[20];
    char surname[20];
    int  age;
    char gender[7];
} who;

int main(void)
{
    const char *data[2] = 
    {
        "Pebbles Flintstone4Female",
        "Bam-Bam Rubble3Male",
    };
    const char *fmt[2] =
    {
        "%[^ ]%*[^1234567890]%d%s",
        "%[^ ]%[^1234567890]%d%s",
    };

    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            who buff;
            int n;
            if ((n = sscanf(data[j], fmt[i], buff.name, buff.surname, &buff.age, buff.gender)) != 4)
                printf("Oops: format \"%s\", n = %d: %s\n", fmt[i], n, data[j]);
            else
                printf("Format \"%s\": data %s: %s %s %d %s\n",
                       fmt[i], data[j], buff.name, buff.surname, buff.age, buff.gender);
        }
    }
    return 0;
}

出力例:

Oops: format "%[^ ]%*[^1234567890]%d%s", n = 3: Pebbles Flintstone4Female
Oops: format "%[^ ]%*[^1234567890]%d%s", n = 3: Bam-Bam Rubble3Male
Format "%[^ ]%[^1234567890]%d%s": data Pebbles Flintstone4Female: Pebbles  Flintstone 4 Female
Format "%[^ ]%[^1234567890]%d%s": data Bam-Bam Rubble3Male: Bam-Bam  Rubble 3 Male

フォーマットの文字列リテラルでコンパイルするとsscanf()、GCC は問題について警告します。

td.c: In function ‘main’:
td.c:23: warning: format ‘%d’ expects type ‘int *’, but argument 4 has type ‘char *’
td.c:23: warning: format ‘%s’ expects type ‘char *’, but argument 5 has type ‘int *’
td.c:23: warning: too many arguments for format

異なるフォーマット文字列を使用した上記のコードでは、その警告は表示されません。

フォーマット文字列も、バッファ オーバーフローを避けるために変更する必要があります。

"%19[^ ] %19[^0-9] %d %6s"
于 2013-08-01T06:09:20.183 に答える