我的程序需要确定指针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;
答案 0 :(得分:0)
摆脱编译器警告的最佳方法是将p1
和p2
更改为指向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)
这是几个标准库函数strstr
,strpbrk
等的不一致。标准要求它们返回一个非常量指针,指向const限定字符串中的找到项。当标准委员会决定将const-correctness添加到这些库函数的参数而不是返回类型时,他们吸烟了什么,我不知道。
您无法在标准C中可靠地实现此类功能,因为您不允许从&#34;限定指针转换为类型&#34;到&#34;类型&#34;的指针。 C11 6.7.6.1:
要使两个指针类型兼容,两者应完全相同 限定,两者都是兼容类型的指针。
这就是您不断收到编译器警告的原因。违反此规则的行为被(非规范性)附件J列为未定义行为:
两个需要兼容的指针类型不是相同的限定条件,或者不是指向兼容类型的指针(6.7.6.1)。
因此,您的问题的答案是,strstr
和char* 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}}