Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C错误,需要帮助吗_C - Fatal编程技术网

C错误,需要帮助吗

C错误,需要帮助吗,c,C,我有一个我过去几天一直在做的最后工作项目,我很紧张,因为截止日期到了,我找不到我的代码有什么问题,我做的每件事都会给我“分段错误”错误,但是当我编译它时,它不会给我任何错误。 我想要它做的很简单,我有一个文件Navios.txt(下面是Navios.txt上文件内容的一个示例:“《亚马逊卫报》”0398“油轮”72910 1999“希腊”“Sanferu Kaiun”) 以下是脚本: typedef struct{ char nomenavio; int codi

我有一个我过去几天一直在做的最后工作项目,我很紧张,因为截止日期到了,我找不到我的代码有什么问题,我做的每件事都会给我“分段错误”错误,但是当我编译它时,它不会给我任何错误。 我想要它做的很简单,我有一个文件Navios.txt(下面是Navios.txt上文件内容的一个示例:“《亚马逊卫报》”0398“油轮”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);
}
谢谢你的时间,很抱歉之前的帖子,我第一次使用这个论坛。
继续努力:)

“亚马逊卫报”不是一个字符,而是一个字符串。将其指定为%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大师,所以请随意纠正我可能做过的可怕的事情