C错误,需要帮助

时间:2011-05-25 18:10:18

标签: c

我有这个最后的工作项目,我过去几天一直在做,我吓坏了,因为截止日期在这里,我无法找到我的代码有什么问题,我做的一切给了我&#34 ;分段错误"错误,但是当我编译它并没有给我任何错误。 我想要它做的很简单,我有一个文件Navios.txt,(这里有一个navios.txt文件内容的样本:""亚马逊卫报" 0398&# 34;油轮" 72910 1999"希腊"" Sanferu Kaiun"") 这是脚本:

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);
}

感谢您的时间和对不起上一篇文章,我第一次使用此论坛。 保持良好的工作:)

6 个答案:

答案 0 :(得分:2)

你的文件读取逻辑是错误的 - 每当你看到使用feof()时,你几乎可以肯定。您需要测试fscanf的返回值。

答案 1 :(得分:1)

“亚马逊卫报”不是一个字符,它是一个字符串。你将它指定为%c并传入一个字符。当然,这也是错误的,因为你应该传入指针而不是char。我很惊讶编译器没有警告你。打开-Wall。

答案 2 :(得分:1)

#include <stdio.h>
#include <io.h>
#include <stdlib.h>


typedef struct{
        char nomenavio[20];
        int codigonavio;
        char tiponavio[20];
        int tonelagemnavio;
        int anonavio;
        char paisnavio[20];
        char armadornavio[20];
}NAVIO;


void listarnavios(FILE*lista, NAVIO*lstNavio){
        do
        {
                //printf("Scanning...\n");
                fscanf(lista,"\"\"%[^\"]\" %d \"%[^\"]\" %d %d \"%[^\"]\" \"%[^\"]\"\"\n", lstNavio->nomenavio, &lstNavio->codigonavio, lstNavio->tiponavio, &lstNavio->tonelagemnavio, &lstNavio->anonavio,lstNavio->paisnavio, lstNavio->armadornavio);
                //printf("Printing...\n");
                printf("%s %d %s %d %d %s %s\n", lstNavio->nomenavio, lstNavio->codigonavio, lstNavio->tiponavio, lstNavio->tonelagemnavio, lstNavio->anonavio, lstNavio->paisnavio, lstNavio->armadornavio);       
        }while(!feof(lista));
        printf("Done\n");
}


int main(){
        NAVIO*lstNavio = malloc(sizeof(NAVIO));
        FILE *lista;
        lista=fopen("navios.txt", "r+");
        if(lista==NULL){
                printf("Error");
                exit(1);
        }
        listarnavios(lista, lstNavio);
        return 0;
}

这应该可以,只要您提供了正确的文件格式。梅尔建议的fscanf格式有一些小的修正。还进行了一些其他更改以使代码运行。

我不是大师,所以请随意纠正我可能做过的可怕事情。但它运行:))

编辑:注释掉调试打印输出

答案 3 :(得分:0)

main(){
    NAVIO*lstNavio;
    //... 
    listarnavios(lista, *lstNavio);
}

看到这个我想知道 - 在使用*lstNavio之前,它在哪里得到它的价值?

答案 4 :(得分:0)

在main()中,NAVIO * lstNavio;是一个指针,但你永远不会为它分配内存,你将这个未初始化的指针传递给listarnavios()并开始写入内存中的一些随机位置。

将main()更改为此并将osersands添加为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
}

......好吧,这是在您尝试解析的内容中编辑之前。如果您尝试读取完整字符串,其中一些是引号分隔的,则需要重新设计struct和scanf / printf格式。 scanf的简单解析功能无法处理您的输入。

答案 5 :(得分:0)

您尚未为lstNavio分配存储空间,因此它指向无效内存。您需要使用malloc(3)分配它,或者如John所说,使用堆栈变量。此外,%c是一个字符。 %s匹配非空格字符,因此您的fscanf将无法与%s一起使用。您需要使用:

fscanf("\"[^\"]\" %d \"[^\"]\" %d %d \"[^\"]\" \"[^\"]\"", ...);