2015-02-09 53 views
-3

好吧,我正在做一个班级的任务,在这个班级中,我必须读取电阻上的4个色带并确定其电阻值。为了做到这一点,我编写了代码,首先要求用户输入相应于特定乐队颜色的字母。例如R对应于红色。这里是我写的代码:扫描码不起作用

char band1, band2, band3, band4; 
float firstband, secondband, thirdband, fourthband; 
float value1, value2, value3, value4, finvalue; 
printf("Please enter the 1st band: "); 
scanf("%c", &band1); 
printf("Please enter the 2nd band: "); 
scanf("%c", &band2); 
printf("Please enter the 3rd band: "); 
scanf("%c", &band3); 
printf("Please enter the 4th band: "); 
scanf("%c", &band4); 

问题是,当用户被要求输入字母时,请求会混乱起来。它给了我这样的:

请输入第一个乐队:

请输入第二个波段:请进入第三个波段:

请进入第四区段:阻力是...

只有第一带值和第三带值被读取,第二和第四被跳过。我似乎无法找到代码中的错误。

+0

噢,非常感谢你!它现在有效。 – 2015-02-09 21:56:00

+2

出于好奇,你如何区分黑色,棕色,蓝色,绿色和灰色? – Wintermute 2015-02-09 21:59:33

+2

代码提示“请输入第一个乐队:”。用户输入'R'(红色),然后输入回车键或'\ n''。 'scanf(“%c”,&band1);'读取''R'和'scanf(“%c”,&band2);'读取''\ n''。键入2个键。 2键读取。 “第二次和第四次被跳过”并非如此。只是代码读入'band2'的''\ n'。 – chux 2015-02-09 22:09:13

回答

1

您没有做任何错误检查或输入清除。结果,下一个scanf调用“吃掉”来自前一个字符的无效字符,导致看起来被“跳过”。

为了解决这个问题,你可以使用下面的函数来清除输入缓冲区(这是什么scanf从第一读取):

void clear_input() { 
    int ch = 0; 
    while((ch = getchar) != '\n' && ch != '\0' && ch != EOF); 
} 

而且,这是一个好主意,让成习惯检查scanf的返回值;这确保了有效的输入端为:

int check = -1; 
do { 
    check = scanf("%c", &variable); 
    clear_input(); 
} while (check != 1); 

scanf的选择,如果你只需要一个字符可能是使用getchar(void)getchar()从用户获取单个字符并返回该字符的值。即使你走这条路,你仍然必须清除输入缓冲区。

3

您正在喂养scanf参考单个char变量。你似乎想要输入字符串,它是char的数组。

是这样的:

char aString[20]; 

printf("Enter a string, no more than 19 characters: "); 
scanf("%s", aString); 

它说:“不超过19个字符”因为在C字符串是空终止的。

然而,这只是用简单的方式来理解。但它很容易出错。正如评论中指出的那样,这将更加强大:

if (1 != scanf("%19s", aString)) 
{ 
    Handle_problem(); 
} 
+0

不,我需要字符,因为我之后使用了switch语句来确定与用户输入的字母对应的值。 – 2015-02-09 21:58:43

+3

所以......你没有给我们足够的信息来帮助。从你发布你需要的代码来看,这是非常不清楚的。 – Almo 2015-02-09 22:00:01

+0

对不起,我以为我写的很清楚。 – 2015-02-09 22:04:34