无法理解这个const指针错误

时间:2017-03-07 22:05:30

标签: c pointers const

我的程序需要确定指针s1是否包含s2中的任何字符,然后在s1中返回指向该位置的指针,否则返回NULL。

#include <stdio.h>

char * strpbrk(const char *, const char *);

int main(void){
const char *s1 = "hello";
const char *s2 = "world";

printf("Repeated character in s1 is %p", *strpbrk(s1, s2));

}

char * strpbrk(const char * s1, const char * s2){
char *p1, *p2;

p1 = s1;
p2 = s2;
for(; *p1 != '\0'; p1++){
    for(; *p2 != '\0'; p2++){
        if(*p1 == *p2){
            break;
        }
        else{
            return '\0';
        }
    }
}
return p1;
}

继续收到此错误:

test.c: In function ‘strpbrk’:
test.c:16:5: warning: assignment discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
  p1 = s1;
     ^
test.c:17:5: warning: assignment discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
  p2 = s2;

2 个答案:

答案 0 :(得分:0)

摆脱编译器警告的最佳方法是将p1p2更改为指向const char的指针,然后在返回p1时添加强制转换。这样代码的读者就会发现你并不打算修改字符串参数。

实施中还有一些错误,我希望能够解决这个问题。

char * strpbrk(const char * s1, const char * s2) {
    const char *p1, *p2;

    for (p1 = s1; *p1 != '\0'; p1++) { // out is a label
        for (p2 = s2; *p2 != '\0'; p2++) {
            if (*p1 == *p2) {
                // Match found
                return (char*)p1;
            }
        }
    }
    // No match found
    return NULL;
}

答案 1 :(得分:0)

这是几个标准库函数strstrstrpbrk等的不一致。标准要求它们返回一个非常量指针,指向const限定字符串中的找到项。当标准委员会决定将const-correctness添加到这些库函数的参数而不是返回类型时,他们吸烟了什么,我不知道。

您无法在标准C中可靠地实现此类功能,因为您不允许从&#34;限定指针转换为类型&#34;到&#34;类型&#34;的指针。 C11 6.7.6.1:

  

要使两个指针类型兼容,两者应完全相同   限定,两者都是兼容类型的指针。

这就是您不断收到编译器警告的原因。违反此规则的行为被(非规范性)附件J列为未定义行为:

  

两个需要兼容的指针类型不是相同的限定条件,或者不是指向兼容类型的指针(6.7.6.1)。

因此,您的问题的答案是,strstrchar* strpbrk_rw (char* s1, const char* s2); // read/write parameter 等函数无法在标准C中安全且可移植地实现。必须使用非标准语言扩展或其他函数来实现编程语言。

声音解决方案是忽略标准规定的函数声明,而是使用理性声明。任

const char* strpbrk_ro (const char* s1, const char* s2); // read-only parameter

{{1}}