一、输入格式配对错误

①案例一:

#include<stdio.h>
void main()
{
double x,y;
scanf("%f%f",&x,&y)
}

改正:将%f改为%lf;如果是float定义的变量,则可用%f;
Add:f与e作用相同且可以互相替换,如%f、%e、%le;
%g------用于输出实数,根据数值大小自动选择f或者e格式;
利用c语言对于printf中格式符号“F”和“f”、“L”和“l”等是不分大小写的特点,利用这个可以有效防如“1”与“l”的混淆;

②案例二:

#include<stdio.h>
void main()
{
int a=9,b=5,c=0;
char c = 'A';
scanf("%2d%*3d%3d%d%c",&a,&b,&c);
printf("a=%g b=%g c=%c",a,b,c);
}

此时:
输入:123456789 得到:a=12 b=6789 c=
解释:”*“号代表输入项仅仅读入数据不赋给相应的变量 而最后c存入的是换行符,它是不可显示的字符;
若将scanf中改为%2d%*3c%1d%c
则输出: a=12 b=6 c=7,这里不再做出更为详细的解释;

输入:123 456 789
输出:a=12 b=456 c=
解释:很明显它将12赋给了a,然后3被丢弃,再往后遇到空格,编译系统则会认为这个字符串已经结束,然后又将456赋给了b,但同理6后面有空格便阻断了789的输入;

二、scanf与回车键

#include<stdio.h>

#include<stdio.h>
void main()
{
char c1,c2,c3;
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
scanf("%c%c%c",&c1,&c2,&c3);
printf("%d,%d,%d\n",a,b,c);
printf("%c,%c,%c",c1,c2,c3);
}

此时,若输入:12 34 56回车abc
则输出:12,34,56回车,a,b
若输入:12 34 56abc
则输出:12 ,34,56a,b,c
解释:第一行输入时将12 34 56分别赋值给abc;回车被作为字符赋给变量c1,后面字符ab分别给了c2和c3;
解决方法:
①将第二行的scanf中的第一个%c之前加一个空格;
②在两组输入之间加一个fflush(stdin);清空缓冲区;

同理接下来这个程序

#include<stdio.h>

#include<stdio.h>
void main()
{
char c1;
for(;;)
{
printf("继续则输入Y:");
scanf("%c",&c1);
if(c1!='Y')break;
printf("go on\n");
}
printf("go out\n");
}

我们便可以发现当输入Y时,它会出现这样的情况

C语言的一些常见错误(1)_3d


这就是因为第二次直接把回车赋给c;

解决方案:

①在%c前面加入空格;

②使用fflush(stdin);