在C中的for循环中使用结构指针时出现一些分段错误
下面是一些打印结构值的简单代码 in_hotel_info函数用于获取结构输入(是的,我使用“get”,因为我的教授强迫我使用它)。而且当我把“0”作为输入时,它结束并返回它的输入数字。 我用sscanf扫描字符串和数字在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
#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中,如果用户输入的元素多于从数组中写入的元素,则需要获取要在参数中读取的最大元素数
- 读取
时,如果从数组中写入的输入名称长度超过29,请使用p->name
而不是%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);
}