因为你输入N的值之后敲了回车,%c会得到一个换行符
你需要在%c之前再加一个%c,把换行符吸收掉,或者前面加个getchar,或者其他类似的指令
因为第二次循环时,x接收的是上一行输入的换行符啊。在每个scanf语句后面加一个getchar(),接收掉换行符就行了
# include <stdio.h>
# include <math.h>
int main ()
{
float a,b,c,l,s,p;
printf("请输入三角形三边:");
scanf ( "%f%f%f",&a,&b,&c);
if (a+b>c&&a+c>b&&b+c>a&&a-b<c&&a-c<b&&b-c<a)//三角形成立的条件是 任意两边和大于第三边,任意两边差小于第三边
{
l=a+b+c;
p=l/2;
s=sqrt(p*(p-a)*(p-b)*(p-c));
printf("\n三角形三边分别为:\n \na=%7.2f\tb=%7.2f\tc=%7.2f\n\n",a,b,c);
printf("三角形的边长为:%7.2f\n\n三角形的面积为:%7.2f\n\n",l,s);
}
else
printf("三边不能构成三角形\n");
return 0;
}
不能构成三角形的情况
答案:
问题分析: 根据提供的参考资料,可以看出scanf存在一些坑点,例如在输入时多加了一个“\n”就会导致无响应,而当输入的类型与要求不一致时,scanf会直接跳过不接收,但是输入的内容并没有被清除,就一直被存在缓存区里,下次读取时又会被读取。这些问题都可能导致无法正常读取输入的值。因此,在查找问题时需要注意这些细节。
解决方案: 对于该问题,没提供源代码,因此无法准确分析出原因,但从问题描述来看,可能是存在读取类型与要求不一致、或者是输入值被缓存等问题。因此,可尝试以下几点改进:
int n, count=0;
while (count<2) {
printf("请输入一个整数:");
count = scanf("%d", &n);
if (count != 1) {
printf("输入的不是整数,请重新输入!\n");
while (getchar() != '\n'); // 清除缓存区
}
}
以上代码中,使用了一个count变量来统计读取数据项的数量,如果count不等于1,说明读取的不是整数,需要重新输入。同时,还加入了清空输入缓存区的语句,防止缓冲区中的非法字符影响下一次输入的正确性。值得注意的是,在用户输入非法字符后要及时清空缓存区,否则会影响下一次的输入,导致错误。
scanf("%d", &n);
while (getchar() != '\n'); // 清除缓存区
通过以上两方面的改进,应该就能够解决该问题。当然,还需要注意一些细节问题,如输入内容是否符合要求、scanf中是否存在问题等。
完整代码:
#include <stdio.h>
int main() {
int n, count=0;
while (count<2) {
printf("请输入一个整数:");
count = scanf("%d", &n);
if (count != 1) {
printf("输入的不是整数,请重新输入!\n");
while (getchar() != '\n'); // 清除缓存区
}
}
printf("读取的整数为:%d\n", n);
return 0;
}