【问题标题】:Trying to pass ragged array to library qsort function试图将参差不齐的数组传递给库 qsort 函数
【发布时间】:2013-08-14 17:19:26
【问题描述】:

有什么办法可以用参差不齐的数组来做到这一点?

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*function for use in built-in quick sort*/
static int compare(const void *x,const void *y){
    return strcmp(*(const char**)x, *(const char**)y);
}

int main(){
    FILE *p = fopen("file.txt","w");
    char ch = '\0',**c = (char**)calloc(6,sizeof(char*));
    int n[6]={0},i=0,j=0;
    fprintf(p,"jack\ndanny\njohn\nrachael\nrobin\ntom");
    fclose(p);
    p = fopen("file.txt","r");
    while(1){/*count number of char to create ragged array*/
        while((ch=getc(p))!= '\n'){
            if(ch == EOF) break;
            putchar(ch);
            n[i]++;
        }
        printf(" %d\n",n[i]);
        if(ch == EOF) break;
        ch = '\0';
        i++;
    }
    ch = '\0';
    for(i=0;i<6;i++)/*allocating memory*/
        c[i] = (char*) calloc(n[i],sizeof(char));
    fclose(p);
    i=0;
    p = fopen("file.txt","r");
    while(1){/*read from file to ragged array*/
        while((ch=getc(p))!= '\n'){
            if(ch == EOF) break;
            *(c[i]+j) = ch;
            j++;
        }
        i++;
        j = 0;
        if(ch == EOF) break;
        ch = '\0';
    }
    /*using built-in quick sort*/
    qsort(*c,6,sizeof(char*),compare);/*why won't this work?*/

    for(i=0;i<6;i++)
        printf("%s\n",*c[i]);
    return 0;
}

【问题讨论】:

  • 它适用于在 main 本身中声明的字符串数组,但是当我使用不规则数组从文件中获取输入时失败了。我做错了什么?
  • 编辑这部分后生效,for(i=0;i
  • 对不起对不起我明白了:)
  • 它只是偶然的。如果你通过例如运行你的程序valgrind,它将检测大量缓冲区溢出。
  • 我听说过锯齿状数组,但是“参差不齐”的数组?

标签: c qsort


【解决方案1】:
    for(i=0;i<6;i++)/*allocating memory*/
        c[i] = (char*) calloc(n[i],sizeof(char));

你也需要在每个字符串后面加上 nul 终止符,这应该是

        c[i] = (char*) calloc(n[i] + 1,sizeof(char));

请记住,当您回读字符串时,您需要确保它们为 nul 也终止了。现在不需要它,因为 calloc() 将确保你的最后一个字节 string 是值 0,但通常需要注意。

    /*using built-in quick sort*/
    qsort(*c,6,sizeof(char*),compare);/*why won't this work?*/

取消引用 c 并将其传递给 qsort 将是错误的,应该只是

    qsort(c,6,sizeof(char*),compare);

与 printf 相同, *c[i] 不是 char * ,因为 printf %s 格式化程序所期望的。应该是

        printf("%s\n",c[i]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 2013-01-27
    • 2013-07-11
    相关资源
    最近更新 更多