多个scanf()用于获取字符串和整数。其中一些被忽视了

多个scanf()用于获取字符串和整数。其中一些被忽视了,c,input,scanf,C,Input,Scanf,代码如下: #include<stdio.h> #include<stdlib.h> typedef struct _car { char *engine; char *model; int mileage; } car; car car1; int main() { car car2; car1.engine = (char *)malloc(100*sizeof(char)); car2.engine = (char

代码如下:

#include<stdio.h>
#include<stdlib.h>
typedef struct _car {
    char *engine;
    char *model;
    int mileage;
} car;


car car1;
int main()
{
    car car2;
    car1.engine = (char *)malloc(100*sizeof(char));
    car2.engine = (char *)malloc(100*sizeof(char));
    car1.model = (char *)malloc(100*sizeof(char));
    car2.model = (char *)malloc(100*sizeof(char));
    printf("\nEnter the Engine, model and mileage of the car1 :");
    scanf("%[^\n]s",car1.engine);
    scanf("%[^\n]s",car1.model);
    scanf("%d",&car1.mileage);
    printf("\nEnter the Engine, model and mileage of the car2 :");
    
    scanf("%[^\n]s",car2.engine);
    scanf("%[^\n]s",car2.model);
    scanf("%d",&car2.mileage);
    printf("\nEngine = %s , Model = %s and mileage = %d" , car1.engine , car1.model , car1.mileage);
    printf("\nEngine = %s , Model = %s and mileage = %d" , car2.engine , car2.model , car2.mileage);

    return 0;
}
所以我输入了“发动机1”然后输入了“车型1”,然后它要求提供汽车2的信息,而不是让我输入里程数,所以我输入了“发动机2”

它跳过了car1.model、car1.milies和car2.model的输入。

使用:

/。。。
printf(“\n输入汽车的发动机、型号和里程1:”);
scanf(“%99[^\n]”,car1.engine)//此说明符中未使用s
scanf(“%99[^\n]”,car1.model);
scanf(“%d”、&car1.里程);
printf(“\n输入汽车的发动机、型号和里程数2:”);
scanf(“%99[^\n]”,car2.engine);
scanf(“%99[^\n]”,car2.model);
scanf(“%d”、&car2.里程);
//...
说明符前的空格丢弃输入后stdin中保留的换行符

还建议在读取字符串时使用大小限制以避免缓冲区溢出,因为您的缓冲区有100个字符的空间,99是您应该使用的大小,将最后一个字符留给字符串空终止符

为了彻底检查,您应该检查
scanf
return以确保正确读取输入,例如:

if(scanf(" %99[^\n]",car1.model) == 1){ 
    //Ok, 1 value read
}
else{
    //handle bad input situation
}

没有
%[^\n]s
格式说明符。尾随的
s
将逐字记录。正确的格式是
%[^\n]
。您不检查
scanf
返回的值。应该这样做。虽然可以使用
%[^\n]
说明符,但使用
fgets
似乎更干净。不要使用scanf一次读取一行。与
%[^\n]
一起使用它而不是
%99[%\n]
与使用
得到的
一样糟糕,谢谢你,先生。在发布这个问题之后,我添加了fflush(stdin);每次扫描之后,它仍然不起作用。然后我在格式说明符前面加了一个空格,它就起作用了。如果您不介意的话,先生,您能简单解释一下为什么会发生这种情况吗?我的意思是,即使添加了fflush?@thetrickster,fflush也应该与stdout一起使用,与stdin一起使用可能会调用未定义的行为,请参阅。
if(scanf(" %99[^\n]",car1.model) == 1){ 
    //Ok, 1 value read
}
else{
    //handle bad input situation
}