这就是我的项目:
您管理一家旅行社,您希望您的n名司机输入以下详细信息:
<<ol>您的程序应该以漂亮的方式打印驱动程序的详细信息。用户结构。
这是我的解决方案:
#include <stdio.h>
struct driver_details
{
char name[50];
char licence_no[25];
char route[20];
char kms[5];
};
void displayDetails(struct driver_details arr)
{
printf("t1. Name of the driver: %sn",arr.name);
printf("t2. Driving License Number: %sn",arr.licence_no);
printf("t3. Route followed: %sn",arr.route);
printf("t4. Total Kilometers travelled: %sn",arr.kms);
}
int main()
{
int n;
printf("Enter the number of drivers:n");
scanf("%d",&n);
struct driver_details arr[n];
for (int i = 0; i < n; ++i)
{
printf("Enter the detail of driver number: %dn",(i+1));
printf("Enter your name:n");
gets(arr[i].name);
printf("Enter your driving license number:n");
gets(arr[i].licence_no);
printf("Enter your route:n");
gets(arr[i].route);
printf("Enter the kilometers travelled:n");
gets(arr[i].kms);
printf("n");
}
for (int i = 0; i < n; ++i)
{
printf("The details of the driver %s:n",arr[i].name);
displayDetails(arr[i]);
}
return 0;
}
我希望它一个接一个地获取用户详细信息,然后相应地打印它们。但是,当我运行程序时,观察到以下情况:
Enter the number of drivers:
1
Enter the detail of driver number: 1
Enter your name:
Enter your driving license number:
User
Enter your route:
xyz-abd
Enter the kilometers travelled:
2345
The details of the driver :
1. Name of the driver:
2. Driving License Number: User
3. Route followed: xyz-abd
4. Total Kilometers travelled: 2345
如图所示,它完全跳过了name属性,我尝试了各种方法,但都不起作用。我该怎么办?
p。S:我对结构不是很精通
函数gets
是不安全的,不被C标准支持。不要使用它。请使用标准函数fgtes
或scanf
。
代码的问题是,在调用scanf
scanf("%d",&n);
输入缓冲区包含新的行字符'n'
,对应于按下的回车键。
结果gets
的下一次调用读一个空字符串。
你应该从输入缓冲区中删除新的行字符。
如果要使用scanf
而不是gets
,那么你可以这样写,例如
scanf("%d",&n);
struct driver_details arr[n];
for (int i = 0; i < n; ++i)
{
printf("Enter the detail of driver number: %dn",(i+1));
printf("Enter your name:n");
scanf( " %49[^n]", arr[i].name);
//...
等使用scanf
的类似调用。
注意格式字符串中的前导空格。它允许跳过输入缓冲区中的空白字符。
如果要使用fgets
,那么可以写
scanf("%d",&n);
struct driver_details arr[n];
while ( getchar() != 'n' );
for (int i = 0; i < n; ++i)
{
printf("Enter the detail of driver number: %dn",(i+1));
printf("Enter your name:n");
fgets( arr[i].name, sizeof( arr[i].name ), stdin );
arr[i].name[ strcspn( arr[i].name, "n" ) ] = ' ';
//...
,并使用fgtes
的类似调用。
要使用标准字符串函数strcspn
,您需要包含头<string.h>
请记住,scanf
不会去掉尾随的换行符,除非请求,因此您的名称输入会得到一个看起来像空行的内容。