2012-11-28 111 views
0

請一些人告訴我這是爲什麼函數調用導致分割故障爲什麼函數調用導致分段錯誤?

看代碼的第二部分,第一部分是沒有錯誤我已經調試它

向下滾動到第二代碼段

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
#include"line.h" 
main(int argc,char **argv,...) 
{ 
    FILE *fp; 
    char ch,**str=0; 
    int length=0,maxlen=0,line=0; 

    if(argc==2) 
    fp=fopen(argv[1],"r"); 

    else 
    { 
    printf("Expexted Input Was:\"./linesort\" \"filename\"\n"); 
    return; 
    } 

    if(fp==NULL) 
    { 
    printf("Source file not found ,Please Check If It Really Exists in Expected path\n"); 
    return; 
    } 

    printf("%ld:",ftell(fp)); 

    while((ch=fgetc(fp))!=EOF) 
    { 
    length=0; 
    while(ch!='\n') 
    { 
    printf("%c",ch); 
    ch=fgetc(fp); 
    length++; 
    } 

    printf("len:%d\n",length); 
    if(maxlen<length) 
    maxlen=length; 
    line++; 
    } 

printf("maxlen:%d\n",maxlen); 
printf("No.of lines:%d\n",line); 
fseek(fp,0,0); 
str=(char **)malloc(line*sizeof(char *)); 
printf("__%ld____\n",str); 

for(length=0;length<line;length++) 
{ 
printf("%d\t",length); 
str[length]=malloc((maxlen+1)*sizeof(char)); 
printf("__%ld____\n",str[length]); 
fgets(str[length],maxlen+1,fp); 
puts(str[length]); 
} 

fclose(fp); 

while(1) 
{ 
    printf(" \n'a':for alphabet wise \t'c':for character wise\t 'e':to exit:\t"); 
    ch=getchar(); 
    getchar(); 

///////本節段錯誤引起和下面的代碼是延續previus代碼

看看alpha(str,maxlen,line);

switch(ch) 
    { 
     case 'a': alpha(str,maxlen,line);///////////Causes Segmentation Fault?Why? 
       break; 
    //case 'c':chara(str); 
    // break; 
    case 'e':exit(0); 
    default :; 
    } 
    } 
} 

//// alpha.c(被調用的功能在此文件)不介意,如果這部分有一個邏輯上的錯誤

#include"line.h" 
    void alpha(char **p,int maxlen,int line) 
    { 
    int i=0; 
    char *buffer; 
    printf("in alpha"); 
    buffer = (char *)malloc((maxlen+1)*sizeof(char)); 
    while(i<line) 
    { 
     if(strcmp(p[i],p[i+1])==+1) 
     { 
     strcpy(buffer,p[i+1]); 
     strcpy(p[i+1],p[i]); 
     strcpy(p[i],buffer); 
     } 
     i++; 
    } 
     printf("%s\t",p[3]); 
    } 

/////// 我的頭文件(line.h)包含這些聲明

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
void alpha(char **p,int maxlen,int line); 
void chara(char **p,int maxlen,int line); 
+1

您是否嘗試過它運行在一個調試器?這通常會準確地指出你爲什麼錯過。 –

+1

請改善您的代碼的格式。這很難閱讀。 – 2012-11-28 18:59:51

+0

添加'\ n',使用'puts'或'fflush'進行調試。否則,線路將不會出現。無論如何,最好的方法是使用調試器。 – md5

回答

1

在功能alpha()

while(i < (line - 1)) 
{ 
    if(strcmp(p[i],p[i+1])==+1) 
    { 
     strcpy(buffer,p[i+1]); 
     strcpy(p[i+1],p[i]); 
     strcpy(p[i],buffer); 
    } 
    i++; 
} 

最後一行是不與任何下一行匹配...

+0

非常感謝@Adeel Ahmed – Neeraj

0

在Eclipse中創建或Visual Studio新的C項目和日運行e調試器就可以了。看看執行的最後一行是什麼。使用調試器查看變量以查看什麼是無效的,以及可能導致它的原因。

另外,您還沒有在應該打開的文件中發佈任何示例輸入。

+0

感謝您的回答 – Neeraj

相關問題