2013-10-06 182 views
0

玉傢伙,我的計劃的目的是從名爲orginal.txt格式包含名稱的文本文件閱讀:分段故障

Kyle Butler 
Bob Jones 
Nathan Moore 

然後該程序需要這些名字一次一個,並把它們轉化成類似:

[email protected] 

這個地址,然後通過行存儲線稱爲final.txt

問題是一個新的文本文件,我不能讓它開始工作,它給了我一個segme ntation故障甚至不得到書面final.txt

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

void write(char line[100]); 

int main() 
{ 
    FILE *fp; 
    fp = fopen("original.txt", "r+"); 

    char line[100]; 
    char mod[30]="@fakeemail.com\n"; 
    while (fgets(line, 100, fp) != NULL){ 
     int i; 
     for(i=0; i<100; ++i){ 
      if(line[i]==' '){ 
       line[i]='.'; 
      } 
      if(line[i]=='\n'){ 
       line[i]='\0'; 
      } 
      strcat(line, mod); 
     } 



     FILE *fp2; 
     fp2 = fopen("final.txt", "a"); 

     if (fp2 != NULL){ 
      fputs(line, fp2); 
      fclose(fp2); 
     } 

    } 

    fclose(fp); 





    return 0; 
} 
+0

段錯在哪裏發生?在這條線上? strcat(line,mod); – canhazbits

+1

作爲升級,您可能需要考慮是否需要爲每次寫入打開和關閉輸出文件。 – Duck

+1

您是否定義了自己的函數'write'?已經有一個名爲'write'的C庫例程。您應該選擇一個更適合我們應用程序的名稱。 '寫'是相當普遍的。 – lurker

回答

4

有幾個問題的代碼,但分割故障可能是由這個for循環造成的:

for(i=0; i<100; ++i){ 
    if(line[i]==' '){ 
     line[i]='.'; 
    } 
    if(line[i]=='\n'){ 
     line[i]='\0'; 
    } 
    strcat(line, mod); 
} 

每次通過您將循環連接到modline。由於您迭代循環100而沒有其他選項退出循環,並且line只有100個字符長,因此您很快就會將line的第100個字符寫入內存的某個其他部分。

+0

+1非常確定'strcat'應該在循環之外,這將解決這個問題的答案。 – WhozCraig

+0

歡呼聲,我記得看到了這一點,並認爲它看起來有點不合適:) –

0

更改建議:

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

#define MAXLEN 100 /* Somehow parameterize "100" */ 

void write(char line[100]); 

int main() 
{ 
    FILE *fp; 
    fp = fopen("original.txt", "r+"); 
    if (!fp) { /* Check for error */ 
     perror ("open failed"); 
     return 1; 
    } 
    char line[MAXLEN]; 
    /* You don't need hard-coded array length with a static string */ 
    char *mod="@fakeemail.com\n"; 
    while (fgets(line, MAXLEN, fp) != NULL){ 
     int i; 
     /* You don't need to iterate through more characters than the string contains */ 
     for(i=0; i<strlen(line); ++i){ 
      if(line[i]==' '){ 
       line[i]='.'; 
      } 
      if(line[i]=='\n'){ 
       line[i]='\0'; 
      } 
     } 
     /* Move this OUTSIDE of your for loop */ 
     strcat(line, mod); 

     /* Append to the output file */ 
     FILE *fp2; 
     fp2 = fopen("final.txt", "a"); 
     /* You're checking for error: good! */ 
     if (fp2 != NULL){ 
      fputs(line, fp2); 
      fclose(fp2); 
     } 

    } 

    fclose(fp); 
    return 0; 
} 
+0

你真的會在條件表達式中調用'strlen()',而不是隻用一個本地'char *'來移動字符串,直到null -char被擊中(並且在這個過程中拋出100步for-loop)?或者,這只是您針對的最小變化? – WhozCraig

-1

由於mbratch寫你寫超出線陣列100個字符。這是一個工作代碼:

void write(char line[100]); 

int main() 
{ 
    FILE *fp; 
    fp = fopen("original.txt", "r+"); 

    char line[100]; 
    char mod[30]="fakeemail.com\n"; 
    while (fgets(line, 100, fp) != NULL){ 
     int i; 
     for(i=0; i<100; ++i){ 
      if(line[i]==' '){ 
       line[i]='.'; 
      } 
      if(line[i]=='\n'){ 
       line[i]='@'; strcat(line, mod); 
       line[i+strlen(mod)]='\0'; 
      } 
     } 
     FILE *fp2; 
     fp2 = fopen("final.txt", "a"); 

     if (fp2 != NULL){ 
      //fputs(line, fp2); printf("%s\n",line); 
      fprintf(fp2,"%s\n",line); 
      fclose(fp2); 
     } 
    } 

    fclose(fp); 
    return 0; 
}