6

問題: scanf を使用して、| で区切られたフィールドを持つ文を読み取ろうとしています。、したがって、当然、scanfの自然な機能を使用してこのシンボルを無視しますが、|を持つものもすべて無視します 初期化。

単純化されたコード:

int main(){
    char* a=malloc(8);
    char* b=malloc(8);
    scanf("%s | %s",a,b);
    printf("%s %s",a,b);
}

入力を試みると:

テスト | 自分

意図したとおりに動作しますが、次の場合があります。

私をテスト|

自然にテストを読み取りますが、ME | を無視します。これを回避する方法はありますか?

4

5 に答える 5

18
    scanf("%[^ \t|]%*[ \t|]%[^ \t\n|]", a,b);
    printf("%s %s",a,b);

注釈:

%*: この要素を無視します。

%*s// このテキストの読み上げをスキップする

%[character set(allow)]: 指定した文字セットのみを読み取ります。

%[0123456789]または%[0-9]// 数字のみを文字列として読み取る

%[^character set(denied)]^:文字セットの先頭に が指定されている場合以外の文字を意味します。

于 2013-06-20T12:59:08.123 に答える
1

これはうまくいくはずです。

char a[200], b[200];

scanf ("%[^|]| %[^\n]", a, b);  // Use it exactly
printf ("a = %s\nb = %s\n", a, b);

このフォーマットの意味。書式文字列を 3 つの部分に分けて説明します。

"%[^|]" - バー文字 ('|') が現れるまで、すべてを最初の文字列にスキャンします。

"| " - '|' を読み取ります そしてそれを無視します。すべての空白文字を読み取り、それらを無視します。

"%[\n]" - 行の残りを 2 番目の文字列に読み込みます。

テストケース

first string is         this | 2nd is this
a = first string is     this
b = 2nd is this

no space|between bar
a = no space
b = between bar
于 2013-06-21T04:31:10.617 に答える
-1

をいじる代わりに、scanf()より健全な関数を使用してみてください-(直感的な)期待どおりに機能するもの:

char s1[] = "FOO | BAR";
char s2[] = "FOO BAR |";

void print_sep(char *in)
{
    char *endp;
    char *sep = strtok_r(in, "|", &endp);
    printf("%s\n", sep);
    if (sep = strtok_r(NULL, "|", &endp))
        printf("%s\n", sep);
}

print_sep(s1);
print_sep(s2);
于 2013-06-21T04:39:28.163 に答える