0

私のプログラムの目的は、次の形式の名前を含む orginal.txt というテキスト ファイルから読み取ることです。

Kyle Butler
Bob Jones
Nathan Moore

次に、プログラムはこれらの名前を 1 つずつ取得し、次のように変換します。

Kyle.Butler@emailaddress.com

このアドレスは、final.txt という名前の新しいテキスト ファイルに 1 行ずつ保存されます。

問題は、それを機能させることができないことです。セグメンテーション違反が発生し、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);
}

modに連結しているループを通過するたびにline100ループを終了する他のオプションがなく、100 文字しかないループ時間を繰り返すためline、すぐに の 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 に答える