0

我多次仔细检查了所有内容,但我不明白为什么我能够编译可执行文件,但是一旦启动就会给我这个错误“分段错误:11”。

这是我的代码:

#include<stdio.h>

void vocali(char testo[101], output)
{

char a=0,e=0,i=0,o=0,u=0;
int contatore=0, j=0;

for (j=0; j<100; j++)
{
    if((testo[j] =='a')||(testo[j]=='A'))
    {
        contatore++;
        a++;
    }
    else if((testo[j] =='e')||(testo[j]=='E'))
    {
        contatore++;
        e++;
    }
    else if((testo[j] =='i')||(testo[j]=='I'))
    {
        contatore++;
        i++;
    }
    else if((testo[j] =='o')||(testo[j]=='O'))
    {
        contatore++;
        o++;
    }
    else if((testo[j] =='u')||(testo[j]=='U'))
    {
        contatore++;
        u++;
    }
}
fprintf((FILE*)output, "%s", "%d", "Le vocali nella stringa sono:\n",contatore);
fprintf(output, "Lettere 'A' sono: %d\n",a);
fprintf(output, "Lettere 'E' sono: %d\n",e);
fprintf(output, "Lettere 'I' sono: %d\n",i);
fprintf(output, "Lettere 'O' sono: %d\n",o);
fprintf(output, "Lettere 'U' sono: %d\n",u);
}


void consonanti(char testo[101], output)
{

char b=0,c=0,d=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0;
int contatore=0,i=0;

for (i=0; i<100; i++)
{
    if ((testo[i]=='b')||(testo[i]=='B'))
    {
        contatore++;
        b++;
    }
    else if ((testo[i]=='c')||(testo[i]=='C'))
    {
        contatore++;
        c++;
    }
    else if ((testo[i]=='d')||(testo[i]=='D'))
    {
        contatore++;
        d++;
    }
    else if ((testo[i]=='f')||(testo[i]=='F'))
    {
        contatore++;
        f++;
    }
    else if ((testo[i]=='g')||(testo[i]=='G'))
    {
        contatore++;
        g++;
    }
    else if ((testo[i]=='h')||(testo[i]=='H'))
    {
        contatore++;
        h++;
    }
    else if ((testo[i]=='j')||(testo[i]=='J'))
    {
        contatore++;
        j++;
    }
    else if ((testo[i]=='k')||(testo[i]=='K'))
    {
        contatore++;
        k++;
    }
    else if ((testo[i]=='l')||(testo[i]=='L'))
    {
        contatore++;
        l++;
    }
    else if ((testo[i]=='m')||(testo[i]=='M'))
    {
        contatore++;
        m++;
    }
    else if ((testo[i]=='n')||(testo[i]=='N'))
    {
        contatore++;
        n++;
    }
    else if ((testo[i]=='p')||(testo[i]=='P'))
    {
        contatore++;
        p++;
    }
    else if ((testo[i]=='q')||(testo[i]=='Q'))
    {
        contatore++;
        q++;
    }
    else if ((testo[i]=='r')||(testo[i]=='R'))
    {
        contatore++;
        r++;
    }
    else if ((testo[i]=='s')||(testo[i]=='S'))
    {
        contatore++;
        s++;
    }
    else if ((testo[i]=='t')||(testo[i]=='T'))
    {
        contatore++;
        t++;
    }
    else if ((testo[i]=='w')||(testo[i]=='W'))
    {
        contatore++;
        w++;
    }
    else if ((testo[i]=='x')||(testo[i]=='X'))
    {
        contatore++;
        x++;
    }
    else if ((testo[i]=='y')||(testo[i]=='Y'))
    {
        contatore++;
        y++;
    }
    else if ((testo[i]=='z')||(testo[i]=='Z'))
    {
        contatore++;
        z++;
    }
}
fprintf(output, "le consonanti nella stringa sono: ",contatore);
fprintf(output, "Lettere 'B' sono: %d\n",b);
fprintf(output, "Lettere 'C' sono: %d\n",c);
fprintf(output, "Lettere 'D' sono: %d\n",d);
fprintf(output, "Lettere 'F' sono: %d\n",f);
fprintf(output, "Lettere 'G' sono: %d\n",g);
fprintf(output, "Lettere 'H' sono: %d\n",h);
fprintf(output, "Lettere 'J' sono: %d\n",j);
fprintf(output, "Lettere 'K' sono: %d\n",k);
fprintf(output, "Lettere 'L' sono: %d\n",l);
fprintf(output, "Lettere 'M' sono: %d\n",m);
fprintf(output, "Lettere 'N' sono: %d\n",n);
fprintf(output, "Lettere 'P' sono: %d\n",p);
fprintf(output, "Lettere 'Q' sono: %d\n",q);
fprintf(output, "Lettere 'R' sono: %d\n",r);
fprintf(output, "Lettere 'S' sono: %d\n",s);
fprintf(output, "Lettere 'T' sono: %d\n",t);
fprintf(output, "Lettere 'V' sono: %d\n",v);
fprintf(output, "Lettere 'W' sono: %d\n",w);
fprintf(output, "Lettere 'X' sono: %d\n",x);
fprintf(output, "Lettere 'Y' sono: %d\n",y);
fprintf(output, "Lettere 'Z' sono: %d\n",z);
}

void numeri(char testo[101], output)
{

char zero=0,uno=0,due=0,tre=0,quattro=0,cinque=0,sei=0,sette=0,otto=0,nove=0;
int contatore=0, k=0;

for (k=0; k<100; k++)
{
    if(testo[k] =='0')
    {
        contatore++;
        zero++;
    }
    else if(testo[k] =='1')
    {
        contatore++;
        uno++;
    }

    else if(testo[k] =='2')
    {
        contatore++;
        due++;
    }
    else if(testo[k] =='3')
    {
        contatore++;
        tre++;
    }
    else if(testo[k] =='4')
    {
        contatore++;
        quattro++;
    }
    else if(testo[k] =='5')
    {
        contatore++;
        cinque++;
    }
    else if(testo[k] =='6')
    {
        contatore++;
        sei++;
    }
    else if(testo[k] =='7')
    {
        contatore++;
        sette++;
    }
    else if(testo[k] =='8')
    {
        contatore++;
        otto++;
    }
    else if(testo[k] =='9')
    {
        contatore++;
        nove++;
    }
}
fprintf(output, "I numeri nella stringa sono: %d\n",contatore);
fprintf(output, "I numeri '0' sono: %d\n",zero);
fprintf(output, "I numeri '1' sono: %d\n",uno);
fprintf(output, "I numeri '2' sono: %d\n",due);
fprintf(output, "I numeri '3' sono: %d\n",tre);
fprintf(output, "I numeri '4' sono: %d\n",quattro);
fprintf(output, "I numeri '5' sono: %d\n",cinque);
fprintf(output, "I numeri '6' sono: %d\n",sei);
fprintf(output, "I numeri '7' sono: %d\n",sette);
fprintf(output, "I numeri '8' sono: %d\n",otto);
fprintf(output, "I numeri '9' sono: %d\n",nove);
}


int main()
{

FILE *inFile = fopen("input.txt","r");
FILE *outputVocali = fopen("vocali.txt","w+");
FILE *outputConsonanti = fopen("consonanti.txt","w+");
FILE *outputNumeri = fopen("numeri.txt","w+");

if(inFile == NULL)
{
    printf("Errore nell'aprire input.txt\n");
}
if(outputVocali == NULL)
{
    printf("Errore nell'aprire vocali.txt\n");
}
if(outputConsonanti == NULL)
{
    printf("Errore nell'aprire consonati.txt\n");
}
if(outputNumeri == NULL)
{
    printf("Errore nell'aprire numeri.txt\n");
}

char testo[100];

fgets(testo, sizeof testo, inFile);

vocali(testo, outputVocali);
consonanti(testo, outputConsonanti);
numeri(testo, outputNumeri);

fclose(inFile);
fclose(outputVocali);
fclose(outputConsonanti);
fclose(outputNumeri);

return 0;
}

这个错误的原因是什么?查看源代码,你能告诉我它是什么生成的吗?

非常感谢

4

1 回答 1

1

看起来这条线是罪魁祸首:

fgets(testo, sizeof testo, inFile) ;

没有input.txt现在可靠地为我产生了段错误。如果您无法打开文件,您需要做的不仅仅是打印错误消息。还有其他几个问题,例如在函数定义中output需要一个类型:

void vocali(char testo[101], FILE * output)
                             ^^^^^^

并且您的几个fprintfs 具有比需要更多的参数,并且看起来不正确,例如:

fprintf(output, "%s", "%d", "Le vocali nella stringa sono:\n",contatore);
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

看起来不像你真正想要的。打开编译器警告会标记出很多这样的问题,例如gccclang以下标志不是一个错误的设置:

-W -Wall -Wextra -pedantic

我意识到您是 SO 新手,但您应该努力提供SSCCE,它将帮助您调试问题并帮助我们解决问题。

于 2013-10-30T12:57:02.243 回答