C错误,需要帮助吗
我有一个我过去几天一直在做的最后工作项目,我很紧张,因为截止日期到了,我找不到我的代码有什么问题,我做的每件事都会给我“分段错误”错误,但是当我编译它时,它不会给我任何错误。 我想要它做的很简单,我有一个文件Navios.txt(下面是Navios.txt上文件内容的一个示例:“《亚马逊卫报》”0398“油轮”72910 1999“希腊”“Sanferu Kaiun”) 以下是脚本:C错误,需要帮助吗,c,C,我有一个我过去几天一直在做的最后工作项目,我很紧张,因为截止日期到了,我找不到我的代码有什么问题,我做的每件事都会给我“分段错误”错误,但是当我编译它时,它不会给我任何错误。 我想要它做的很简单,我有一个文件Navios.txt(下面是Navios.txt上文件内容的一个示例:“《亚马逊卫报》”0398“油轮”72910 1999“希腊”“Sanferu Kaiun”) 以下是脚本: typedef struct{ char nomenavio; int codi
typedef struct{
char nomenavio;
int codigonavio;
char tiponavio;
int tonelagemnavio;
int anonavio;
char paisnavio;
char armadornavio;
}NAVIO;
void listarnavios(FILE*lista, NAVIO*lstNavio){
do{
fscanf(lista,"%c %d %c %d %d %c %c\n", lstNavio->nomenavio, &lstNavio->codigonavio, lstNavio->tiponavio, &lstNavio->tonelagemnavio, &lstNavio->anonavio, &lstNavio->armadornavio);
printf("%c %d %c %d %d %c %c\n", lstNavio->nomenavio, lstNavio->codigonavio, lstNavio->tiponavio, lstNavio->tonelagemnavio, lstNavio->anonavio, lstNavio->armadornavio);
}while(!feof(lista));
}
main(){
NAVIO*lstNavio;
FILE *lista;
lista=fopen("navios.txt", "r+");
if(lista==NULL){
printf("Error");
exit(1);
}
listarnavios(lista, *lstNavio);
}
谢谢你的时间,很抱歉之前的帖子,我第一次使用这个论坛。
继续努力:)“亚马逊卫报”不是一个字符,而是一个字符串。将其指定为%c并传入一个字符。当然,这也是错误的,因为您应该传入指针,而不是字符。我很惊讶编译器没有警告你。打开-墙。“亚马逊卫报”不是一个字符,而是一个字符串。将其指定为%c并传入一个字符。当然,这也是错误的,因为您应该传入指针,而不是字符。我很惊讶编译器没有警告你。打开-Wall.你的文件读取逻辑是错误的-每当你看到feof()的使用,你几乎可以肯定这一点。您需要测试fscanf的返回值。您的文件读取逻辑是错误的-无论何时看到feof()的使用,您几乎可以肯定这一点。您需要测试fscanf的返回值
main(){
NAVIO*lstNavio;
//...
listarnavios(lista, *lstNavio);
}
看到这一点,我想知道——在使用*lstNavio
之前,它的价值从何而来
看到这一点,我想知道——在使用*lstNavio
之前,它的值是从哪里来的?在main()中,NAVIO*lstNavio;是一个指针,但您从未为它分配内存,您将这个未初始化的指针传递到listarnavios()并开始写入内存中的某个随机位置
将main()更改为此,并按照osgx的建议添加符号,它应该可以工作
main(){
NAVIO lstNavio; // <-- stack var instead of pointer
FILE *lista;
lista=fopen("navios.txt", "r+");
if(lista==NULL){
printf("Error");
exit(1);
}
listarnavios(lista, &lstNavio); // <-- pass address of stack var
}
main(){
NAVIO lstNavio;//在main()中,NAVIO*lstNavio;是一个指针,但您从未为它分配内存,您将此未初始化的指针传递到listarnavios()中,然后开始写入内存中的某个随机位置
将main()更改为此,并按照osgx的建议添加符号,它应该可以工作
main(){
NAVIO lstNavio; // <-- stack var instead of pointer
FILE *lista;
lista=fopen("navios.txt", "r+");
if(lista==NULL){
printf("Error");
exit(1);
}
listarnavios(lista, &lstNavio); // <-- pass address of stack var
}
main(){
NAVIO lstNavio;//您尚未为lstNavio分配存储,因此它指向无效内存。您需要使用malloc(3)
或如John所说,使用堆栈变量进行分配。此外,%c是一个字符。%s与非空格字符匹配,因此您的fscanf将无法与%s一起使用。您需要使用:
fscanf("\"[^\"]\" %d \"[^\"]\" %d %d \"[^\"]\" \"[^\"]\"", ...);
您尚未为lstNavio分配存储,因此它指向无效内存。您需要使用malloc(3)
或正如John所说的,使用堆栈变量进行分配。此外,%c是一个字符。%s与非空格字符匹配,因此您的fscanf将无法与%s一起使用。您需要使用:
fscanf("\"[^\"]\" %d \"[^\"]\" %d %d \"[^\"]\" \"[^\"]\"", ...);
#包括
#包括
#包括
类型定义结构{
char nomenavio[20];
int codigonavio;
char tiponavio[20];
国际tonelagemnavio;
国际海军;
char paisnavio[20];
char armadornavio[20];
}纳维奥;
void listarnavios(文件*lista,NAVIO*lstNavio){
做
{
//printf(“扫描…\n”);
fscanf(列表“\”%[^\”]\%d\“%[^\”]\%d\“%[^\”]\”\“%[^\”]\“\n”,Lsnavio->nomenavio,&Lsnavio->codigonavio,Lsnavio->tiponavio,&Lsnavio->tonelagemnavio,&Lsnavio->anonavio,Lsnavio->paisnavio,Lsnavio->armadornavio);
//printf(“打印…\n”);
printf(“%s%d%s%d%d%s%s\n”,lstNavio->nomenavio,lstNavio->codigonavio,lstNavio->tiponavio,lstNavio->tonelagemnavio,lstNavio->anonavio,lstNavio->paisnavio,lstNavio->armadornavio);
}而(!feof(lista));
printf(“完成”\n);
}
int main(){
NAVIO*lstNavio=malloc(sizeof(NAVIO));
文件*lista;
lista=fopen(“navios.txt”、“r+”);
if(lista==NULL){
printf(“错误”);
出口(1);
}
listarnavios(lista,lstNavio);
返回0;
}
只要您提供了正确的文件格式,这应该是可行的。Mel建议的fscanf格式有一些小的修改。为了使代码运行,还做了一些其他更改
我不是c大师,所以请随意纠正我可能做过的可怕的事情
编辑:注释出调试打印输出#包括
#包括
#包括
类型定义结构{
char nomenavio[20];
int codigonavio;
char tiponavio[20];
国际tonelagemnavio;
国际海军;
char paisnavio[20];
char armadornavio[20];
}纳维奥;
void listarnavios(文件*lista,NAVIO*lstNavio){
做
{
//printf(“扫描…\n”);
fscanf(列表“\”%[^\”]\%d\“%[^\”]\%d\“%[^\”]\”\“%[^\”]\“\n”,Lsnavio->nomenavio,&Lsnavio->codigonavio,Lsnavio->tiponavio,&Lsnavio->tonelagemnavio,&Lsnavio->anonavio,Lsnavio->paisnavio,Lsnavio->armadornavio);
//printf(“打印…\n”);
printf(“%s%d%s%d%d%s%s\n”,lstNavio->nomenavio,lstNavio->codigonavio,lstNavio->tiponavio,lstNavio->tonelagemnavio,lstNavio->anonavio,lstNavio->paisnavio,lstNavio->armadornavio);
}而(!feof(lista));
printf(“完成”\n);
}
int main(){
NAVIO*lstNavio=malloc(sizeof(NAVIO));
文件*lista;
lista=fopen(“navios.txt”、“r+”);
if(lista==NULL){
printf(“错误”);
出口(1);
}
listarnavios(lista,lstNavio);
返回0;
}
只要您提供了正确的文件格式,这应该是可行的。Mel建议的fscanf格式有一些小的修改。为了使代码运行,还做了一些其他更改
我不是c大师,所以请随意纠正我可能做过的可怕的事情