6

私はCプログラミングを学んでいます。%c奇妙なループを書きましたが、 inを使用している間は機能しませんscanf()
コードは次のとおりです。

#include<stdio.h>
void main()
{
    char another='y';
    int num;
    while ( another =='y')
    {
        printf("Enter a number:\t");
        scanf("%d", &num);
        printf("Sqare of %d is : %d", num, num * num);
        printf("\nWant to enter another number? y/n");
        scanf("%c", &another);
    }
}

しかし、%sたとえばscanf("%s", &another);、このコードで を使用すると、正常に動作します。
なぜこれが起こるのですか?何か案が?

4

4 に答える 4

10

変換は%c、それが何であるかに関係なく、入力から次の 1 文字を読み取ります。この場合、以前に を使用して数値を読み取っています%d。その番号を読み取るにはエンター キーを押す必要がありましたが、入力ストリームから改行を読み取るために何もしていません。したがって、%c変換を行うと、入力ストリームからその改行が読み取られます (読み取られるのを待っている入力が既にあるため、実際に何かを入力するのを待たずに)。

を使用する%sと、先頭の空白をスキップして、空白以外の文字を取得します。改行を空白として扱うため、待機中の改行を暗黙的にスキップします。(おそらく) 読み取られるのを待っているものは他にないので、明らかに望んでいるように、何かを入力するのを待ちます。

変換に使用する場合%cは、フォーマット文字列の前にスペースを入れることができます。これにより、ストリーム内の空白もスキップされます。

于 2012-12-11T05:29:02.507 に答える
2

最初の scanf %d の数値を入力した後、ENTER キーが標準入力ストリームにあります。このキーは scanf %c 行によって取得されます。

使用してscanf("%1s",char_array); another=char_array[0];ください。

于 2012-12-11T05:43:03.027 に答える
1

getch()この場合の代わりに使用scanf()します。scanf() は '\n' を想定していますが、その scanf() で 1 文字しか受け入れていないためです。そのため、次の scanf() に '\n' を指定すると混乱が生じます。

于 2012-12-11T05:28:29.350 に答える
0
#include<stdio.h>
void main()
{
char another='y';
int num;
while ( another =='y')
{
    printf("Enter a number:\t");
    scanf("%d", &num);
    printf("Sqare of %d is : %d", num, num * num);
    printf("\nWant to enter another number? y/n");
    getchar();
    scanf("%c", &another);
}
}
于 2012-12-11T05:30:52.197 に答える