簡體   English   中英

如何在c qsort函數(數組是指針數組)中修復“ discard const”,可能與對指針的理解有關

[英]How to fix the “discard const” in c qsort function (the array is a pointer array), might related to the understanding of pointers

我現在正在學習C。 當前正在學習c指針(指針數組)。 下面的代碼(簡而言之,是C語言的原型)試圖做的是逐行從stdin中讀取文本。 每個數組元素都是一個指向一行文本的指針,然后通過僅對指針進行排序來對文本進行排序。 當我嘗試編譯代碼時,編譯器(gcc)發出警告“ discard const”,我嘗試在str_compare函數中添加強制類型轉換(const char **),但仍然無法解決我的問題

我認為這可能與我對c指針的理解有關。 有人可以幫助指出我在哪里做錯了嗎,請問我的代碼有什么問題?

我打開了許多警告標志,並將所有警告視為gcc中的錯誤。 我能理解這些指針,並且之前使用過qsort,結果一切都很好。 但這是我第一次將指針編碼為指針。 所以我想我可能對此有些誤解。

// Read text line by line then sort them, use point array

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

char *getLine(void);
int str_compare(const void *, const void *);

#define NLINES_MAX 1000
char *linePtr[NLINES_MAX];

int main()
{
    // Read lines;
    int long unsigned n = 0;
    for ( ; n < NLINES_MAX && (linePtr[n] = getLine()) != NULL; ++n)
        ;

    if ( !feof(stdin))
    {
        if (n == NLINES_MAX)
            fputs("sorttex: too many lines.\n", stderr);
        else
        {
            fputs ("sorttext: error reading from stdin.\n", stderr);
        }
    }
    else
    {
        qsort(linePtr, n, sizeof(char *), str_compare);
        for ( char **p = linePtr; p < linePtr +n; ++p)
            puts(*p);
    }
    return 0;
}

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

#define LEN_MAX 512

char *getLine()
{
    char buffer[LEN_MAX], *lineP = NULL;
    if (fgets (buffer, LEN_MAX, stdin) != NULL)
    {
        size_t len = strlen(buffer);
        if (buffer[len-1] =='\n')
            buffer[len-1] = '\0';
        else
        {
            ++len;
        }
        if ((lineP = malloc(len)) != NULL)
            strcpy( lineP, buffer);
    }
    return lineP;
}

gcc標志是:

 -std=c11 -pedantic-errors -pipe -O2 -Wall -Werror -Wextra -Wfloat-equal \\ -Wshadow -Wpointer-arith -Wcast-align -Wstrict-overflow=5 -Wwrite-strings \\ -Waggregate-return -Wcast-qual -Wswitch-default -Wswitch-enum -Wconversion \\ -Wunreachable-code -Winit-self -march=native 

我希望擺脫“丟棄常量”警告消息

傳遞給str_compare函數的參數是數組元素的地址。 該數組元素的類型為char * ,並且str_compare的調用方將其視為const,然后將其傳入地址。因此,您實際上將收到一個char * const *

因此, const void *實際上是

指向常量指針的指針

並不是

指向常量char的指針

如您所編碼。

int str_compare(const void *p1, const void *p2)
{
    char * const *pp1 = p1;
    char * const *pp2 = p2;
    return strcmp(*pp1, *pp2);
}

該行可能是:

return strcmp(*(char *const *)p1, *(char *const *)p2);

要排序的項目是char *指針(如您的代碼所說,不是const char *指針)。 內部const是為了確保比較功能不會修改要比較的對象(它們是char *對象,因此是char * const )。

當然,用jxh所示的額外變量擴展它也不是壞主意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM