【问题标题】:Why i have Segmentation Error in this code? [duplicate]为什么我在这段代码中有分段错误? [复制]
【发布时间】:2020-01-10 18:17:40
【问题描述】:

当我尝试在这段代码上使用 Cprogramm 时出现分段错误,我不知道为什么。代码的目标是创建 mini-files.dat,其中包含 nomi.txt 中的人名 + 一个指示 -(负)值是否 > soglia(我在 main 中设置 soglia)的标志。 nomi.txt 是这样的文件:

Mike 12 -16 90
Carl 23 -40 -42
Jonh 18  5  40
Bob -90  12 16

代码如下:

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

typedef char stringa[30];

void creaFile(stringa nome,int flag){
    FILE *fp=fopen(nome,"a+");
    fprintf(fp,"[%s][%d]\n",nome,flag);
fclose(fp);
}

void creaBinarioNegativi(int soglia){

    FILE* fp = fopen("nomi.txt","r+");

    stringa nome;
    int flag=0;
    int cont=0;
    int valore1=0;
    int valore2=0;
    int valore3=0;

        while(!feof(fp)){
            if(fscanf(fp,"%s %d %d %d",nome,valore1,valore2,valore3)!=EOF){
                if(valore1<0) {
                    cont++;
                }
                else if(valore2<0){
                    cont++;
                }
                else if(valore3<0){
                    cont++;
                }
            if(cont>=soglia){flag=1;}
            creaFile(nome,flag);
            }
        }
fclose(fp);                 
}

void main(){
    int soglia = 2;
    creaBinarioNegativi(soglia);
}

【问题讨论】:

  • 您应该检查fopen (etc) 错误。
  • 您能否至少将您的调试器附加到程序中并给我们追溯错误发生的位置?
  • 顺便说一句,请确保标签与问题有合理的关系。如果您的问题是特定于 bash 的,bash 标记将是有意义的(当您从任何其他 shell 运行 C 程序时不会发生错误),但否则就没有任何意义。同样,当问题在其他操作系统上没有发生时使用linux 标签(或者至少当您的程序在使用 Linux 特定工具时遇到错误时),当它在其他操作系统上没有发生时使用gcc 标签编译器(或发生在使用 gcc-only pragma 的代码中)等
  • void main() 不太正确。 C 中的标准 main 函数应该返回一个 int(int main (void)int main(int argc, char **argv)
  • 清理代码警告。他们准确地告诉你问题出在哪里(如下面的答案所述)。

标签: c


【解决方案1】:

这一行是错误的:

if(fscanf(fp,"%s %d %d %d",nome,valore1,valore2,valore3)!=EOF){

参数应该是变量的地址。请注意,nome 已经是一个地址,因为数组衰减为指针。

修复:

if(fscanf(fp,"%s %d %d %d",nome,&valore1,&valore2,&valore3)!=EOF){

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多