1

フォームのユーザーから入力を取得した後、入力時間と分を確認する必要があります。

( Number1 : Number2 ) 

例: ( 12 : 21 )

12 時間 21 分を報告してから、再び入力を待つ必要があります。指定された形式に不一致がある場合は、無効な入力として報告する必要があります。私はこのコードを書きました:

#include<stdio.h>
int main()
{
    int hourInput=0,minutesInput=0; 
    char *buffer = NULL;
    size_t size;

    do
    {
        puts("\nEnter current time : ");
        getline ( &buffer, &size, stdin );

        if ( 2 == sscanf( buffer, "%d:%d", &hourInput, &minutesInput ) && hourInput >= 0 && hourInput <= 24 && minutesInput >=0 && minutesInput <= 60  )
        {

            printf("Time is : %d Hours %d Minutes", hourInput, minutesInput );
        }

        else
        {
            puts("\nInvalid Input");
        }   
    }

    while ( buffer!=NULL && buffer[0] != '\n' );

    return 0;
}

Q. 誰かが数字と の間にスペースを入れると:、私のプログラムはそれを無効な入力と見なしますが、私はそれを有効なものとして扱う必要があります。

誰かがなぜそれが起こっているのか、そしてこの問題を取り除くためのアイデアを説明できますか? 私が理解している限り、sscanf はすべての空白を無視する必要がありますか?

4

6 に答える 6

4

「:」の前にオプションのスペースを許可するには、次のように置き換えます。

"%d:%d"

"%d :%d"

sscanf()フォーマットディレクティブが無視するように指示する空白を無視しますが、どこでもではありません。などのディレクティブ内の空白文字は、' 'すべての空白を無視します。 %d他の整数および浮動小数点ディレクティブと同様に、先頭の空白は無視されます。したがって、前のスペース%dは冗長です。

C11 7,21,6,2,8 指定に [、c、または n 指定子が含まれていない限り、入力空白文字 (isspace 関数で指定) はスキップされます。)


追加の考慮事項には、負の数を受け入れない代替方法として %uとを使用することが含まれます。文字列をスキャンして時間情報を取得するために使用される一般的な関数です。unsignedstrptime()

于 2013-07-18T14:13:44.460 に答える
0

コロンの前後にスペースを入れると、空白は無視され、コロンの前後にスペースを入れなくても機能すると思います。このような:

sscanf( buffer, "%d : %d", &hourInput, &minutesInput )
于 2013-07-18T13:00:13.717 に答える
0

"%d : %d" をフォーマット文字列として使用します。スペースの有無にかかわらず機能します。

于 2013-07-18T13:00:18.013 に答える