0

好的,我的程序的目的是读取一个名为 orginal.txt 的文本文件,其中包含以下格式的名称:

Kyle Butler
Bob Jones
Nathan Moore

然后,程序一次取一个这些名称,并将它们变成如下内容:

Kyle.Butler@emailaddress.com

然后将该地址逐行存储在名为 final.txt 的新文本文件中

问题是,我无法让它工作,它给了我一个分段错误,甚至没有写入 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;
}
4

3 回答 3

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 个字符长,很快您就会将第 100 个字符写入line内存的其他部分。

于 2013-10-06T23:54:58.743 回答
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;
}
于 2013-10-07T00:01:08.900 回答
-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;
}
于 2013-10-07T00:18:00.703 回答