【问题标题】:How to return a pointer from a char* function如何从 char* 函数返回指针
【发布时间】: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*
  • stackoverflow.com/questions/3316562/… 是否回答了您的问题?
  • 返回const char *
  • 我确实将 p 从 char* 更改为 const char*。我仍然得到错误。你能举个例子更具体一点吗?

标签: c++ pointers return constants c-strings


【解决方案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 循环?
  • 非常感谢,阿德里安。你的解释很有用。
猜你喜欢
  • 2016-06-10
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
相关资源
最近更新 更多