在C中复制字符串和指针问题

时间:2012-09-18 10:23:29

标签: c string pointers

在这个exrecie中,我得到了一个输入和输出文件。输入文件包含一个数字,然后是一个长度不超过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;
}

1 个答案:

答案 0 :(得分:0)

该行

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

没关系。您复制到NULL指针。

对于这种情况,请使用例如strdup代替strcpy

arrStr[i] = strdup(str);

不要忘记稍后释放这个字符串。

您也在错误地分配数组:

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

这不分配字符串数组,它分配N * 11个字节。改为:

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