我的C程序中跳过了一个结构参数



这就是我的项目:

您管理一家旅行社,您希望您的n名司机输入以下详细信息:

<<ol>
  • 名称/gh>
  • 驾驶证号码
  • 公里
  • 你的程序应该能够接受n作为输入(或者你可以让n=3简单),你的驱动程序将开始一个接一个地输入他们的详细信息。
  • 您的程序应该以漂亮的方式打印驱动程序的详细信息。用户结构。

    这是我的解决方案:

    #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标准支持。不要使用它。请使用标准函数fgtesscanf

    代码的问题是,在调用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不会去掉尾随的换行符,除非请求,因此您的名称输入会得到一个看起来像空行的内容。

    相关内容

    最新更新