【问题标题】:Copying strings and pointers issue in C在 C 中复制字符串和指针问题
【发布时间】:2012-09-18 10:23:29
【问题描述】:

在这个 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;
}

【问题讨论】:

    标签: c string pointers


    【解决方案1】:

    线

    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 *));
    

    【讨论】:

    • 谢谢你的回答,我可以用“”来初始化arrStr[i]而不是使用strdup吗?另一件事,随着您的分配,在哪里提到了每个字符串不超过 11 个字符的事实?不重要吗?
    • @Joni 不,那么您将尝试复制一个只读的字符串文字,而不是正确的长度。另外,字符串有 10 个还是 11 个字符?如果是 11,那么你需要使 str 12 个字符,一个额外的特殊字符串终止符。
    • @Joni 如果您读取的字符串是 11 个字符,那么 strdup 将为该字符串分配足够的空间,但不会更多(加上一个字节用于终止符或课程)。
    • 它是10的长度,这就是我放11的原因。我还是不明白为什么分配11*N字节是错误的,你知道你有N个单词,而ecah一个不再然后是 10 个字节长。
    • @Joni 一个合适的数组(或数组的数组)是一个连续的内存区域,一个动态的字符串“数组”是不是,它是一个指针。所以calloc 调用为数组内的指针 分配内存,然后你必须分配实际的指针并使它们指向字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 2018-05-24
    相关资源
    最近更新 更多