2013-10-30 160 views
0

我重複了所有檢查了很多次,但我不明白爲什麼我能夠編譯可執行文件,但一旦啓動會給我這個錯誤「分段錯誤:11」。分段錯誤: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; 
} 

,這是什麼錯誤的原因是什麼?查看源代碼,你能告訴我它是什麼產生的嗎?

非常感謝

+0

您是否嘗試過使用gdb [https://www.gnu.org/software/gdb/]來遍歷代碼並查看哪部分代碼生成了seg-fault? – ffledgling

+1

你應該重新考慮你的設計,你的代碼看起來不太好。 – Maroun

+4

當您打開文件失敗但繼續執行時,您會打印錯誤消息...不是一個好主意 –

回答

1

看起來這一行是罪魁禍首:

fgets(testo, sizeof testo, inFile) ; 

沒有出現在input.txt可靠地產生一個段錯誤我。如果您無法打開文件,則需要執行一些操作而不是打印錯誤消息。還有其他一些問題,output需要在你的函數定義,例如:

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

和幾個你fprintf S的比需要更多的參數,並顯示不正確,例如:

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

看起來不像你真正想要的。接通編譯器警告將檢舉了很多這些問題,例如gccclang以下標誌是不是一個壞集:

-W -Wall -Wextra -pedantic 

我知道你是新來的SO,但你應該努力提供SSCCE,它將幫助您調試問題並幫助我們弄清楚。