:
文字列の長さが固定されている場合は、あなただけの%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;
}
最大フィールド幅を使用します。 –
http://sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html – Yunnosch
["scanf']の' "%s"フォーマット(http://en.cppreference.com/ w/c/io/fscanf)は、スペースで区切られた*文字列を読み込みます。入力に空白がないので、最初の ''%s "'は行の* all *を読み込みます。 –