如何从 char* 函数返回指针
Posted
技术标签:
【中文标题】如何从 char* 函数返回指针【英文标题】:How to return a pointer from a char* function 【发布时间】:2021-02-14 16:07:36 【问题描述】:我正在做教授布置的练习。问题是: 编写函数 myStrChr()。该函数有两个参数:一个 const char * s 指向 C 风格字符串中的第一个字符,以及一个 char c。如果 c 没有出现在 s 中,则返回指向 c 出现在 s 中的第一次出现的指针和 nullptr (0)。
我一直在尝试,但仍然无法弄清楚如何修复错误:“从 const char* 到 char* 的无效转换”或“从 char* 到 const char* 的无效转换” 请教我修复它。
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*
的地方始终使用const char*
。
***.com/questions/3316562/… 是否回答了您的问题?
返回const char *
。
我确实将 p 从 char* 更改为 const char*。我仍然得到错误。你能举个例子更具体一点吗?
【参考方案1】:
如 cmets 中所述,您需要在整个函数中始终使用const char*
,或者如果您需要返回一个(非常量)@ 987654323@ 那么你需要在返回之前明确地抛出常量。
但是您的代码中还有其他问题!最严重的是,您的第二个for
循环在找到匹配项时不会停止:您应该在找到字符后立即返回该地址。
第二个(但不太严重),你真的不需要两个循环——你可以简单地将两个循环合并,然后返回一个指向找到的字符的指针,或者如果循环结束但没有找到匹配项,则返回nullptr
。
这是一个有效的函数的简化版本:
const char* mystrChr(const char* s, char c)
while (*s) // Shorthand way of writing "while (*s != '\0')"
if (*s == c) return s; // Found a match, so return current pointer!
++s;
return nullptr; // No match found - return signal null pointer
如果您要求您的函数返回一个非常量char*
指针,那么您可以在返回之前进行显式转换:
char* mystrChr(const char* s, char c)
while (*s)
if (*s == c) return const_cast<char*>(s); // Cast away the constness
++s;
return nullptr; // The cast is not required when using nullptr
编辑:如果,如 cmets 中所述,如果 nul
字符作为 c
参数传递(实际上是 @987654321 @ 确实),您可以通过修改循环后的return
语句来做到这一点:
const char* mystrChr(const char* s, char c)
while (*s)
if (*s == c) return s;
++s;
return (c == '\0') ? s : nullptr;
【讨论】:
代码为mystrChr(s, 0)
返回一个空指针。我希望否则空字符是 C 字符串的一部分,即最后一部分。也许是do
循环?
非常感谢,阿德里安。你的解释很有用。以上是关于如何从 char* 函数返回指针的主要内容,如果未能解决你的问题,请参考以下文章