使用%c,奇数循环不起作用

时间:2012-12-11 05:23:08

标签: c scanf

我倾向于C编程。我写了一个奇怪的循环,但在%c中使用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 个答案:

答案 0 :(得分:10)

%c转换从输入中读取下一个单个字符,无论它是什么。在这种情况下,您之前使用%d读取了一个数字。您必须按Enter键才能读取该数字,您还没有做任何事情来从输入流中读取新行。因此,当您执行%c转换时,它会从输入流中读取该换行符(无需等待您实际输入任何内容,因为已经有输入等待读取)。

当您使用%s时,它会跳过任何前导空格以获得除空白之外的某些字符。它将新行视为空白行,因此它会隐含地跳过等待的新行。因为(大概)没有其他等待阅读的东西,它会等着你输入一些东西,就像你显然想要的那样。

如果您想使用%c进行转换,可以在格式字符串前面添加一个空格,该空格也会跳过流中的任何空白区域。

答案 1 :(得分:2)

输入第一个scanf%d的数字后,ENTER键位于stdin流中。该键由scanf%c行捕获。

使用scanf("%1s",char_array); another=char_array[0];

答案 2 :(得分:1)

在这种情况下,

使用getch()代替scanf()。因为scanf()需要'\ n',但是你只接受scanf()上的一个char。所以'\ n'给下一个scanf()引起混淆。

答案 3 :(得分: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);
}
}