3

私は文字列(45バイト)を持っています:

        String1        String2000000000001234

この文字列から 3 つの変数を取得する必要があります。

char * var1="String1";
char * var2="String2";
int var3=1234;

ここでは、固定長 (15 バイト) の 3 つの部分があります。文字列の場合はスペースを入れず、整数の場合は先頭にゼロを付けずに、すべての部分を変数に保存する必要があります。

これは scanf() で可能ですか? どうすればそれを行うことができますか?

4

3 に答える 3

4

sscanf ではできません。最初に、char ポインターだけでなく、char配列(および _s 変数を使用する場合はサイズ) を渡す必要があります (つまり、それに関連付けられたメモリが必要です)。次に、sscanf の文字列は空白で終了し、String2 と 0000 の間に何もありません。この形式のカスタム パーサーを作成します。

于 2012-09-24T16:54:06.080 に答える
3

これによると、問題は次の形式で解決する必要があります。

%*[^a-zA-Z]%s%*[^a-zA-Z]%[^0]s%*[^1-9]%d

説明:

%* [^ a-zA-Z]-アルファベット順までスキップ(保存しない)、つまり先頭のスペースをスキップ

%s-スペースまで最初の文字列を読み取ります

%*[^a-zA-Z]-次の文字列まで末尾のスペースをスキップします

%[^0]s-文字列utilzerosを読み取ります

%*[^1-9]-ゼロ以外の数字までスキップします

%d-最後に、番号を読みます

于 2012-09-24T17:19:18.667 に答える
0

最も簡単なのはおそらく次のとおりです。

char var1_buffer[31] = "", var2_buffer[31] = "";
sscanf(string+30, "%d", &var3);
string[30] = '\0';
sscanf(string, "%s%s", var1_buffer, var2_buffer);
var1 = strdup(var1_buffer);
var2 = strdup(var2_buffer);

これには、入力文字列に書き込むことができる必要があります。それが不可能な場合は、3 行目と 4 行目を次のように置き換えることができます。

int p1 = 0;
sscanf(string, "%30s %n%30s", var1_buffer, &p1, var2_buffer);
if (p1 > 30)
    p1 = 30;
var2_buffer[30-p1] = '\0';

いずれの場合も、sscanf の戻り値のチェックを追加して、入力文字列が適切な形式であることを確認する必要があります。

于 2012-09-24T17:17:30.650 に答える