2013-02-14 152 views
0

它第一次工作,当第二次执行时,它跳过第二个scanf函数。谷歌从几个页面后,注意到这是scanf函数的行为,在缓冲区中添加\ n,为了解决这个问题,我在scanf之后添加了fflush(stdin),但它确实起作用,但是当它在第二次执行时,它给我一个错误的结果。有人可以指导我这个计划的问题是什么?C扫描循环

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
char UserInput[50]; 
int i = 0; 
int exit; 


do{ 


printf("Please enter a string (less than 50 character): "); 
scanf("%[a-z,A-Z, ,]s",&UserInput); 

while(UserInput[i] != '\0' && i<50) 
{ 
    i++; 
} 

if (i==50) 
    printf("The string is too long\n"); 
else 
    printf("The length of the string is %d\n",i); 

printf("To continue, please key in any numbers other than 0: "); 
scanf("%d",&exit); 
    fflush(stdin); 
}while(exit !=0); 

system("PAUSE"); 
return 0; 
} 
+0

检查长度_after_读取输入是非常没用的。但是,您可以通过''%50s'''等格式告诉'scanf'获取最多特定数量的字符。 – 2013-02-14 09:08:50

+0

阅读'scanf'返回值的含义,并检查它是否存在解析错误...在使用'scanf'试图找出任何代码出现问题之前没有太多意见,直到您排除了无效输入的简单可能性(或无效的格式字符串,这取决于你的观点)。 – hyde 2013-12-06 00:22:26

回答

1

您不使用&符号来读取数组。将该行更改为:

scanf("%[a-z,A-Z, ,]s",UserInput); 

此外,退出也是char数组,不是整数。要么将exit更改为int或将scanf更改为:scanf("%s",exit);。并且请相信我在C中退出is not a good name

0

有几个问题。

您的循环计算长度有点没有意义,它也不会在运行一次后重置i,所以它会在第二次尝试时中断。

如果您觉得必须计算长度,请删除循环,使用strlen()

更好的是,取消使用sscanf()并改为使用fgets()

注意&UserInput是位毫无意义,名称UserInput会“腐烂”的指针在函数调用的第一个元素(&UserInput[0]),并声明它的最佳方式:

fgets(UserInput, sizeof UserInput, stdin); 

是我将如何写它。不要忘记检查返回值。

0

几次失误和备注:

使用扫描集格式( %[a-zA-Z ])时
  1. ,你不应该在结束时使用s像你一样,也不是逗号应该在那里。
  2. 您应该在致电scanf时检查返回代码,以确保您确实成功读取了应该读取的内容。
  3. 你有可能溢出UserInput缓冲区 - 它只允许一个长度为49的字符串,但是在填充缓冲区时你没有这样的限制。
  4. 在每次迭代之后,您不会将i恢复为0
  5. exit应具有int类型,因为您使用格式%d来填充它。正如别处指出的那样,exit在C中不是一个特别好的变量名(有一个称为exit的标准函数)。
  6. 您使用多个scanf调用,但没有正确注意读取上一次读取的任何剩余食物。最好是逐行读取输入(使用fgets例如。)到缓冲区中,然后从缓冲区中解析出需要的数据。
  7. 请勿在输入流上使用fflush(如stdin)。它仅用于输出流。