多个 scanf() 用于获取字符串和整数。他们中的一些人被忽视了
Multiple scanf() are used for getting string and an integer. Some of them are getting ignored
代码如下:
#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;
}
这是输出:
Engine = engine 1 , Model = and mileage = 0
Engine = model 1 , Model = and mileage = -1307142624
...Program finished with exit code 0
所以我输入 'engine 1' 然后 'model 1' 然后它要求 car2 信息而不是让我输入里程,所以我输入 'engine 2'.
它跳过了 car1.model 、 car1.mileage 和 car2.model 的输入。
使用:
//...
printf("\nEnter the Engine, model and mileage of the car1 :");
scanf(" %99[^\n]",car1.engine); //s is not used in this specifier
scanf(" %99[^\n]",car1.model);
scanf("%d",&car1.mileage);
printf("\nEnter the Engine, model and mileage of the car2 :");
scanf(" %99[^\n]",car2.engine);
scanf(" %99[^\n]",car2.model);
scanf("%d",&car2.mileage);
//...
说明符前的space丢弃输入后保留在stdin中的换行符
还建议在读取字符串时使用大小限制以避免缓冲区溢出,因为您的缓冲区有 space 用于 100 个字符,99 是您应该使用的大小,将字符串的最后一个字符留空终结者。
为了彻底,您应该检查 scanf
return 以确保正确读取输入,例如:
if(scanf(" %99[^\n]",car1.model) == 1){
//Ok, 1 value read
}
else{
//handle bad input situation
}
代码如下:
#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;
}
这是输出:
Engine = engine 1 , Model = and mileage = 0
Engine = model 1 , Model = and mileage = -1307142624
...Program finished with exit code 0
所以我输入 'engine 1' 然后 'model 1' 然后它要求 car2 信息而不是让我输入里程,所以我输入 'engine 2'.
它跳过了 car1.model 、 car1.mileage 和 car2.model 的输入。
使用:
//...
printf("\nEnter the Engine, model and mileage of the car1 :");
scanf(" %99[^\n]",car1.engine); //s is not used in this specifier
scanf(" %99[^\n]",car1.model);
scanf("%d",&car1.mileage);
printf("\nEnter the Engine, model and mileage of the car2 :");
scanf(" %99[^\n]",car2.engine);
scanf(" %99[^\n]",car2.model);
scanf("%d",&car2.mileage);
//...
说明符前的space丢弃输入后保留在stdin中的换行符
还建议在读取字符串时使用大小限制以避免缓冲区溢出,因为您的缓冲区有 space 用于 100 个字符,99 是您应该使用的大小,将字符串的最后一个字符留空终结者。
为了彻底,您应该检查 scanf
return 以确保正确读取输入,例如:
if(scanf(" %99[^\n]",car1.model) == 1){
//Ok, 1 value read
}
else{
//handle bad input situation
}