在C中的for循环中使用结构指针时出现一些分段错误

在C中的for循环中使用结构指针时出现一些分段错误,c,C,下面是一些打印结构值的简单代码 in_hotel_info函数用于获取结构输入(是的,我使用“get”,因为我的教授强迫我使用它)。而且当我把“0”作为输入时,它结束并返回它的输入数字。 我用sscanf扫描字符串和数字 #include <stdio.h> typedef struct hotel_info hotel; struct hotel_info { char name[30]; int rank; double popular; dou

下面是一些打印结构值的简单代码

in_hotel_info函数用于获取结构输入(是的,我使用“get”,因为我的教授强迫我使用它)。而且当我把“0”作为输入时,它结束并返回它的输入数字。 我用sscanf扫描字符串和数字

#include <stdio.h>

typedef struct hotel_info hotel;
struct hotel_info
{
    char name[30];
    int rank;
    double popular;
    double far;
    char breakfast;
};
int in_hotel_info(struct hotel_info *p);
void out_hotel_info(struct hotel_info *p, int N, int G, double D);


int main(void)
{
    hotel hotels[100];
    hotel *p;
    int number = 0, ranks, fars, i;
    number = in_hotel_info(hotels);
    p = hotels;
    printf("%d\n", number);
    getchar();
    for (; p < p+number; p++)
    {
        printf("%s %d %lf %lf %c\n", p->name, p->rank, p->popular, p->far, p->breakfast);
    }
}

int in_hotel_info(struct hotel_info infos[])
{
    char inputs[100];
    hotel* p;
    p = infos;
    int cnt = 0;
    while (1)
    {
        gets(inputs);
        if (strcmp(inputs, "0") == 0)
        {
            break;
        }
        else
        {
            sscanf(inputs, "%s %d %lf %lf %c", p->name, &p->rank, &p->popular, &p->far, &p->breakfast);
        }
        p++;
        cnt++;
    }
    return cnt;
}
但我经常会出现分割错误

问题是,当我试图打印

for (; p < p+number; p++)
    {
        printf("%s %d %lf %lf %c\n", p->name, p->rank, p->popular, p->far, p->breakfast);
    }
for (; p < p+number; p++)
{
    printf("%s %d %lf %lf %c\n", p->name, p->rank, p->popular, p->far, p->breakfast);
}
(;p { printf(“%s%d%lf%lf%c\n”,p->name,p->rank,p->popular,p->far,p->早餐); } 问题是当数字严格为正数时,
p
始终为真,因此for永远不会结束,您以未定义的行为从数组中访问(您的分段错误)


你还有其他问题

  • gets使用起来非常危险,因为它可以从数组中写出来,可以使用fgets或scanf(secifying max length to read),在考虑过的情况下,您可以读取一个数字,然后检查它是否为0

  • 在in_hotel_info中,如果用户输入的元素多于从数组中写入的元素,则需要获取要在参数中读取的最大元素数

  • 读取
    p->name
    时,如果从数组中写入的输入名称长度超过29,请使用
    %29s
    而不是
    %s
    限制大小。还要绕过名称开头的空格,请使用
    %29s
    (前面有空格)

  • 您不检查scanf返回值5,因此不会检测到无效输入


getchar()很奇怪

请阅读C编译器(例如…)和调试器(例如…)的文档。还应阅读C11标准草案。考虑使用或。使用GCC,使用
GCC-Wall-Wextra-g编译
for (; p < p+number; p++)
{
    printf("%s %d %lf %lf %c\n", p->name, p->rank, p->popular, p->far, p->breakfast);
}