好的,所以我正在为一个课程做一个作业,我必须读取电阻器上的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 :(得分: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();
}
答案 1 :(得分:1)
您没有进行任何错误检查或输入清除。结果,下一个scanf
电话"吃掉了#34;导致呼叫的前一个无效字符似乎被"跳过"。
为了解决这个问题,您可以使用以下函数清除输入缓冲区(这是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()
从用户获取单个字符并返回该字符的值。即使你采用这种方式,你仍然需要清除输入缓冲区。