1

以下で(スペースを入れて)書くscanf%d /%d"、スペースで区切られた分数を入力できます。

例:入力は5/7or5 /7または 5 / 7(どこでもスペースを含む) にすることができます。

以下のコードの scanf はどのように数値間のスペースを読み取りますが、その間のスペースは 1 つしかありません%d /%d"

#include <stdio.h>

int main()
{
   int i, j;
   scanf("%d /%d", &i, &j);
   return 0;
}
4

2 に答える 2

4

のほとんどすべての入力形式指定子はscanf、実際のデータを読み取る前にすべての空白を自動的にスキップします。たとえば、 in の%d書式指定子はscanf実際には を意味し<skip spaces> <read int>ます。

つまり%d/%d、分数の読み取りに formatを使用すると、

<skip spaces> <read int> <require /> <skip spaces> <read int>

このシーケンスでは、. の前にスペースを許可/スキップしないことを除いて、必要なものがすべて揃っています/。これを修正するには、 の前/にスペースをスキップする明示的なリクエストを追加する必要があります。これは、scanfフォーマット文字列ではスペース文字で表されます。前にスペース文字を追加すると、フォーマット文字列が/生成されます。%d /%d

<skip spaces> <read int> <skip spaces> <require /> <skip spaces> <read int>

これはまさに私たちが必要としているものであり、まさにあなたのコードにあるものです。

于 2012-11-26T23:20:33.947 に答える
2

ここでは 2 つのことが行われています。

1 つ目は、%d指定子が 10 進数に至るまでの空白を「トリム」することです。そのため、単に(先頭のスペースなしで)(space)4と同じように解析されます。4

2 つ目は、フォーマット文字列に空白を配置すると、任意の数の空白文字 (ゼロを含む) を「食べる」ことです。

空白文字: この関数は、次の非空白文字の前にある空白文字を読み取って無視します (空白文字には、スペース、改行、およびタブ文字が含まれます。isspace を参照してください)。フォーマット文字列内の単一の空白は、ストリームから抽出された任意の数の空白文字 (ゼロを含む) を検証します。

参照

したがって、フォーマット文字列の の前にスペースを使用すると、区切りの空白がある場合 (例: ) と空白がない場合 (例: )/の両方の文字列を一致させることができます。4 /x4/x

于 2012-11-26T23:12:35.843 に答える