2013-10-06 54 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; 
}