首页 > 解决方案 > 多个 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 *)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 的输入。

标签: cinputscanf

解决方案


利用:

//...
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);
//...

说明符之前的空格丢弃输入后留在标准输入中的换行符。

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

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

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

推荐阅读