如何要求输入直到ctrl+;D在C中

如何要求输入直到ctrl+;D在C中,c,C,我有一个问题,写程序,要求输入计数元音。我的问题是询问输入。在这个版本中,程序请求输入并成功地计算其元音。然而,我想找到一种方法来询问输入,直到用户按下CTRL+D,然后显示结果。我使用了while(scanf(“%[^\n]”,a)!=EOF),但它在循环中阻塞了 #include <stdio.h> int main() { char a[150]; int i; int vowels; vowels=0; scanf("%[^\n]",

我有一个问题,写程序,要求输入计数元音。我的问题是询问输入。在这个版本中,程序请求输入并成功地计算其元音。然而,我想找到一种方法来询问输入,直到用户按下CTRL+D,然后显示结果。我使用了
while(scanf(“%[^\n]”,a)!=EOF)
,但它在循环中阻塞了

#include <stdio.h>

int main()
{
    char a[150];
    int i;
    int vowels;
    vowels=0;
    scanf("%[^\n]", a);
    for(i=0; a[i]!='\0'; ++i)
    {
        if(a[i]=='a' || a[i]=='A' || a[i]=='e' || a[i]=='E' || a[i]=='i' || 
           a[i]=='I' || a[i]=='o' || a[i]=='O' || a[i]=='u' || a[i]=='U') {
            ++vowels;
        }
    }
    printf("Vowels: %d\n",vowels);

    return 0;
}
#包括
int main()
{
chara[150];
int i;
int元音;
元音=0;
scanf(“%[^\n]”,a);
对于(i=0;a[i]!='\0';++i)
{
如果(a[i]=='a'| a[i]='a'| a[i]='e'| a[i]='e'| a[i]='i'|
a[i]='i'| | a[i]='o'| | a[i]='o'| | a[i]='u'| | a[i]='u'){
++元音;
}
}
printf(“元音:%d\n”,元音);
返回0;
}
条件
while(scanf(“%[^\n]”,a))!=EOF
将不起作用。第一次调用时,
scanf
将使用新行之前的所有字符,不包括输入缓冲区
a
中的新行

在下一次调用
scanf
时,代码将看到第一次调用中未使用的新行,并将立即使用长度为零的缓冲区(“”)终止scanf。此顺序将在第3、4、。。。调用,给用户一种程序被阻塞在循环中的印象,实际上是这样的

解决此问题的选项很少:

  • 按照Eugene Sh的建议,切换到fgets/sscanf,或
  • 将格式修改为'sscanf(“%[^\n],a)`这将允许代码在读取下一个输入之前跳过空格(包括新行)
  • 将格式修改为
    sscanf(“%%[^\n]]*1[\n]”,a)
    ,它将读取令牌(不带新行),然后跳过字符串后面的新行(如果有新行)

  • 就我个人而言,我会选择#1。但是对于这个问题,它们都会起作用。可能#2是最少的工作量。

    使用
    fgets
    并检查它的返回值。在EOF上它将是
    NULL
    。在while循环中包装scanf应该起作用,但很难说,因为您实际上没有包含该代码。包含不包含的代码为您而不是为您的代码而工作。