扫描代码不起作用

时间:2015-02-09 21:51:57

标签: c printf scanf

好的,所以我正在为一个课程做一个作业,我必须读取电阻器上的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);

问题在于,当要求用户输入请求混乱的字母时。它给了我这个:

请输入第一个乐队:

请输入第二个乐队:请输入第三个乐队:

请输入第四个乐队:抵抗是......

仅读取第一个波段值和第三个波段值,跳过第二个和第四个波段值。我似乎无法在代码中找到错误。

2 个答案:

答案 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()从用户获取单个字符并返回该字符的值。即使你采用这种方式,你仍然需要清除输入缓冲区。