Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从char*函数返回指针_C++_Pointers_Return_Constants_C Strings - Fatal编程技术网

C++ 如何从char*函数返回指针

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

我正在做一个由教授指定的练习。问题是: 编写函数myStrChr()。该函数有两个参数:指向C样式字符串中第一个字符的const char*s和char C。返回一个指针,指向出现在s中的c的第一个外观,如果c没有出现在s中,则返回null ptr(0)

我一直在尝试,但仍然无法确定如何修复错误:“从常量字符*到常量字符*的转换无效”或“从常量字符*到常量字符的转换无效”* 请告诉我怎么修

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。你的解释真的很有用。