循环迭代的次数与输入中的字符数相同

问题描述:

我知道我的标题很奇怪。我不知道怎么说。如果我要输入一个字符,它会循环一次,但如果我输入一个字符,它会循环一次,但如果我再次输入一个字符,我输入5个字符 “你好”,它会遍历5倍。循环迭代的次数与输入中的字符数相同

前。 你想再次运行?(Y/N)

q

你想再次运行?(Y/N)

你好

您想再次运行吗? (y/n)

您想再次运行吗? (y/n)

您想再次运行吗? (y/n)

您想再次运行吗? (y/n)

您想再次运行吗? (Y/N)

这是我的代码:

char a='y'; 
    while(a=='y' || a=='Y') 
    { 
    printf("Enter a p value: \n"); 
    scanf("%d",&p); 
    printf("Enter a q value: \n"); 
    scanf(" %d",&q); 
    printf("Enter a k value: \n"); 
    scanf(" %d",&k); 

    for (i=p; i<q+1; i++) 
    { 
     Q=i; 
     sum=0; 
     count=0; 
     while(Q>0) 
     { 
     count++; 
     r = Q%10; 
     sum = sum + pow(r,k); 
     Q = Q/10; 
     } 

     if (i == sum && i>1 && count==k) 
     { 
     printf("%d\n",i); 

     } 
     i++; 
    } 
    a='z'; 
    while(a !='y' && a !='Y' && a!='n' && a!='N') 
    { 
     printf("Would you like to run again? (y/n) \n"); 
     scanf(" %c", &a); 
    } 
+1

这可能是因为你要求一个字符。询问整条线并检查允许的值。并阅读您在代码中使用的函数的文档。询问时请使用最少的示例。 – 2014-09-21 18:45:49

+0

非常感谢。这工作。我刚换的scanf(“%C”,&a);到scanf函数(“%S”,&a); – 2014-09-21 18:51:17

+1

这可能更好地工作,但你写了''的地址后面它仍然不是正确的。如果你不想关心缓冲区,'getline()'可能是您的选择。 – 2014-09-21 18:55:20

这是因为,scanf的从缓冲器采取它输入参数。对于每个有效参数
(与格式相匹配的参数),scanf会执行其作业,但如果遇到无效的参数(与格式不匹配),它将在缓冲区中保留(跳过)参数。

现在,在您的代码中,您将“Hello”作为输入并使用格式说明符“%c”
因此scanf将输入解释为'H','E','L','L' ,“O”,因为您已经使用“%C”因此
它读出由字符输入字符和因为所有的五个字符是有效的
字符输入因此输出获取打印所有五个字符。