C++ 如何从char*函数返回指针
我正在做一个由教授指定的练习。问题是: 编写函数myStrChr()。该函数有两个参数:指向C样式字符串中第一个字符的const char*s和char C。返回一个指针,指向出现在s中的c的第一个外观,如果c没有出现在s中,则返回null ptr(0) 我一直在尝试,但仍然无法确定如何修复错误:“从常量字符*到常量字符*的转换无效”或“从常量字符*到常量字符的转换无效”* 请告诉我怎么修C++ 如何从char*函数返回指针,c++,pointers,return,constants,c-strings,C++,Pointers,Return,Constants,C Strings,我正在做一个由教授指定的练习。问题是: 编写函数myStrChr()。该函数有两个参数:指向C样式字符串中第一个字符的const char*s和char C。返回一个指针,指向出现在s中的c的第一个外观,如果c没有出现在s中,则返回null ptr(0) 我一直在尝试,但仍然无法确定如何修复错误:“从常量字符*到常量字符*的转换无效”或“从常量字符*到常量字符的转换无效”* 请告诉我怎么修 char* mystrChr(const char *s, char c) { size_t len
char* mystrChr(const char *s, char c)
{
size_t len{};
for (size_t i = 0; s[i] != '\0'; i++)
len++;
char *p = s;
for (size_t i = 0; i < len; i++)
{
if (s[i] == c)
p = &s[i];
else
p = nullptr;
}
return p;
}
char*mystrChr(const char*s,char c)
{
大小{};
对于(大小i=0;s[i]!='\0';i++)
len++;
char*p=s;
对于(大小i=0;i
如注释中所述,您需要在整个函数中始终使用const char*
,或者,如果需要返回(非const)char*
,则需要在返回之前显式抛出constance
但是代码中还有其他问题!最严重的是,第二个for
循环在找到匹配项时不会停止:您应该在找到字符后立即返回该字符的地址
其次(但不太严重),您确实不需要两个循环-您可以简单地合并这两个循环并返回指向找到的字符的指针,或者,如果循环结束时未找到匹配项,则返回nullptr
下面是一个功能的简化版本:
const char*mystrChr(const char*s,char c)
{
while(*s){//while(*s!='\0')的简写方式
如果(*s==c)返回s;//找到匹配项,则返回当前指针!
++s;
}
return nullptr;//未找到匹配项-返回信号null指针
}
如果要求函数返回非常量char*
指针,则可以在返回之前进行显式转换:
char*mystrChr(const char*s,char c)
{
而(*s){
if(*s==c)返回常量(s);//丢弃常量
++s;
}
return nullptr;//使用nullptr时不需要强制转换
}
编辑:如注释中所述,如果要返回字符串“结束标记”的地址(如果nul
字符作为c
参数传递(实际上是作为参数传递),则可以通过在循环后修改return
语句来实现:
const char*mystrChr(const char*s,char c)
{
而(*s){
如果(*s==c),则返回s;
++s;
}
返回(c='\0')?s:nullptr;
}
现在无论您在哪里使用纯char*
都要一致地使用const char*
。这回答了您的问题吗?返回一个const char*
。我确实将p从char*更改为const char*。我仍然会得到错误。您能给我一个例子来更具体一点吗?代码为mystrChr(s,0)返回一个空指针
。我希望不是这样,因为空字符是C字符串的最后一部分。也许是do
循环?非常感谢你,Adrian。你的解释真的很有用。