0

この例では、入力ファイルと出力ファイルを取得します。入力ファイルには数字と 10 以下の長さの文字列が含まれているため、それらを並べ替えて出力ファイルに出力する必要があります。char** arrStrサイズが最大 10 のすべての文字列を含むを定義しました。

次のコードが機能するかどうかを理解しようとしています (何らかの理由で Eclipse で実行できません)。私の主な関心事は、文字列を正しくコピーし、情報を失わないことです。「これでいいですか?」とメモを入れました。私が最も懸念しているステートメントの横に、その他の修正をお願いします。

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

int comp(const void* p1, const void* p2) {
    return strcmp((char*)p1, (char*) p2);
} 

int main(int argc, char** argv) {
    FILE* fin;
    FILE* fout;
    int N;
    char** arrStr;
    char str[11];
    int i;

    if (argc!=3) {
        printf("Please enter the program's name and two paths");
        assert(0);
    }

    fin=fopen(argv[1], "r");
    if (fin==NULL) {
        printf("path 1 is not valid");
        assert(0);
    }

    fout=fopen(argv[2], "w");
    if (fout==NULL) {
        printf("path for file 2 is not valid");
        fclose(fin);
        assert(0);
    }

    fscanf(fin, "%d", &N); 
    arrStr=(char**)calloc(N, sizeof(char)*11);
    for (i=0; i<N; i++) { 
        fscanf(fin, "%s", str);
        strcpy(arrStr[i], str);  /*is it ok?*/
    }

    qsort(arrStr, N, sizeof(char)*11, comp);
    for (i=0; i<N; i++) {
        if (i==N-1)
            fprintf(fout, "%s", arrStr[i]);
        else
            fprintf(fout, "%s,", arrStr[i]);

    }
    fclose(fin);
    free(arrStr);
    fclose(fout);
    return 1;
}
4

1 に答える 1

0

この線

strcpy(arrStr[i], str);  /*is it ok?*/

大丈夫ではありません。NULLポインタにコピーします。

この場合、strdup代わりにeg を使用しstrcpyます。

arrStr[i] = strdup(str);

後でこの文字列を解放することを忘れないでください。

また、配列を間違って割り当てています:

arrStr=(char**)calloc(N, sizeof(char)*11);

これは文字列の配列を割り当てるのではなく、N * 11バイトを割り当てます。への変更:

arrStr = calloc(N, sizeof(char *));
于 2012-09-18T10:34:48.930 に答える