2017-08-11 10 views
2

ユーザは、最初の行の数が(N せ)行数を指示し、そしてどのように1つの文字列、パイプ、次に別の文字列をスキャンして、間にスペースやスペースを入れませんか?

  • この

    2 
    OO|XO 
    XX|XX 
    

    ように、バスの設定を入力します

  • 次のnの行は、2つの座席のペアを示します

  • の間に歩道があり、|と表示されています。

  • 座席は空席でも空でもよい。空席はOと表示されます。占有者はxである。


char str1[3], str2[3]; 

私は、文字列として文字として

char pipe; 

とパイプを座席の各ペアを処理しています。

私はこれをやってみました:

scanf("%s %*c %s", str1, pipe, str2); 

と、この:

scanf("%s", str1); 
pipe = getchar(); 
scanf("%s", str2); 

まだ運。

質問は:どのように2つ以上の文字/文字列を一度に入力するには、何らかのスペースやブレークで区切らずに行けますか?

+1

最大フィールド幅を使用します。 –

+1

http://sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html – Yunnosch

+1

["scanf']の' "%s"フォーマット(http://en.cppreference.com/ w/c/io/fscanf)は、スペースで区切られた*文字列を読み込みます。入力に空白がないので、最初の ''%s "'は行の* all *を読み込みます。 –

答えて

2

まず、%s変換指定子のプロパティを読んでください。入力は空白で区切られ、パイプではなく、少なくとも自動的には区切られません(|)。

最も簡単な回避策は、それは、あなたが別の区切りを選択したい場合は、コードを変更する必要はありません、ここで

scanf("%2s%*c%2s", str1, str2); // the * in %*<CS> indicates assignment suppression, 
           // you don't need a corresponding argument at all, and 
           // a wrong one will cause trouble 

のようなものをmaximum field widthを使用するように、だろう何でもを区切り文字とみなします。あなたが|の使用を強制する場合は、

scanf("%2s|%2s", str1, str2);  

NOTEを書くことができます - 成功を確実にするためにscanf()の戻り値をチェックすることを忘れません。

2

scanfパイプを含め、使用したいセパレータを指定できます。パイプは常にあるので、あなたの代わりにそれをスキップするscanfを指示する、あなたのプログラムにそれをスキャンする必要はありません:あなたの問題を解決するには2種類の方法があります

char a[3], b[3]; 
scanf("%2s|%2s", a, b); 
printf("'%s' '%s'", a, b); 

Demo.

0

  • 文字列の長さが固定されている場合は、あなただけの%sために読んで、このコードを使用する文字の最大数を指定することができます。

    char str1[3], str2[3]; 
    if (scanf("%2s|%2s", str1, str2) == 2) { 
        /* read 2 characters into str1, a pipe and 1 or 2 characters into str2 */ 
    } 
    
  • いくつかの行の座席数が異なるプレーンでは、文字列の長さが可変である場合は、スキャナーセット%[OX]を使用し、予期しない入力でバッファオーバーフローが発生しないように読み取る文字数を指定できます。次に例を示します。

    char str1[5], str2[5]; // handle up to 4 seats on each side */ 
    if (scanf("%4[OX]|%4[OX]", str1, str2) == 2) { 
        /* read a group of 1 to 4 `X` or `O` into str1 and str2, separated by | */ 
    } 
    

あなたはさらにラインが期待される形式を持っていることを確認するために、別の変換を追加することができます。次に例を示します。

#include <stdio.h> 

int main(void) { 
    char buf[128]; 
    int i, n, c; 
    char left[3], right[3]; 

    if (fgets(buf, sizeof buf, stdin) == NULL) { 
     fprintf(stderr, "invalid format, empty file\n"); 
     return 1; 
    } 
    if (sscanf(buf, "%d %c", &n, &c) != 1 || n < 0) { 
     fprintf(stderr, "invalid format, expected positive number: %s\n", buf); 
     return 1; 
    } 
    for (i = 0; i < n; i++) { 
     if (fgets(buf, sizeof buf, stdin) == NULL) { 
      fprintf(stderr, "missing %d lines\n", n - i); 
      return 1; 
     } 
     if (sscanf(buf, "%2[XO]|%2[XO] %c", left, right, &c) != 2) { 
      fprintf(stderr, "invalid format: %s\n", buf); 
      return 1; 
     } else { 
      printf("row %d: %s | %s\n", i + 1 + (i >= 12), left, right); 
     } 
    } 
    return 0; 
} 
関連する問題