【问题标题】:How do I get the right index of the string character?如何获得字符串字符的正确索引?
【发布时间】:2016-05-05 22:39:39
【问题描述】:

写一个函数接收一个字符串和一个要在字符串中搜索的字符。如果数组中存在搜索字符,则此函数函数返回搜索字符的索引,否则返回 -1。此外,如果数组包含多次出现的字符,则返回最左边出现的索引。例如,如果字符串是“abab”并且搜索字符是“b”,则函数返回 1;而如果字符是 'c',则函数返回 -1。 在不使用任何 C++ 库函数的情况下编写函数。

下面是我的功能。

int indexOf(const char str[], char ch)
{
    int search;
    for (int i = 0; i<20; i++)
    {
        if (ch = str[i])
            search ==i;
        else
            search =-1;

    }
    return search;
}

我的问题是当我输入搜索字符或数组中不存在的字符时,我不断得到 19(20-1)。谁能告诉我如何修改我的代码以获得正确的答案?

【问题讨论】:

  • if (ch = str[i])更改为if (ch == str[i])search ==i;更改为search =i;...您的编译器应该发出警告...
  • 您应该传递数组的容量,而不是假设(硬编码)容量为 20。
  • 另外,在if 语句中,将= 更改为==。这里不需要else 子句。
  • 您还应该在if 语句块中添加一个break 语句。一旦找到字符,这将退出循环。按照要求,第一场比赛获胜。
  • 顺便问一下,当一切都像 C 一样,你为什么要标记 C++ 这个问题?

标签: c++ arrays


【解决方案1】:

if (ch = str[i]) 应该是if (ch == str[i]),此时您只是在为ch 分配作业。

search ==i做对比,应该是search = i;所以这是第一个相反的问题。

【讨论】:

  • 就像我在输入额外的部分:)
【解决方案2】:

我的做法是:

int indexOf(const char str[], int size, char ch)
{
    for (int i = 0; i<size; i++)
    {
        if (str[i] == '\0')
            return -1;
        else if(str[i] == ch)
            return i;
    }
    return -1;
}

该方法的优点是不会浪费时间在之前已经发现的字符串的其余部分中进行搜索。

【讨论】:

  • 我认为,只有一个条件: if(str[i] == ch) return i;在 for 循环内就足够了。因为,它应该与字符串的 '\0' 有大小关系:)
  • 想象字符串是“10111213141516171819”。当到达字符串末尾的 9 时,您仍然没有得到 '\0' 字符,因为字符串没有空间。所以你的循环会前进到它不应该的内存区域!
【解决方案3】:

你犯了一些错误。 if (ch = str[i]) 应该是 if (ch == str[i]) 并且 search ==i; 应该是搜索 =i;

而且,如果您传递一个以 null 结尾的字符串,则无需使用 arr 的大小。

你可以这样试试。

int indexOf(const char str[], char ch)
{
    for (int idx = 0; str[idx]; idx++)
    {
        if (str[idx] == ch)
            return idx;
    }
    return -1;
}

【讨论】:

  • 你在for循环中的延续条件str[idx]是错误的!如果字符串结尾之前没有 '\0' 字符,您将得到溢出!这就是需要大小的原因!
  • 是的,字符串应该以空值结尾。感谢您指出。
猜你喜欢
  • 2011-11-03
  • 2021-07-27
  • 1970-01-01
  • 2020-11-06
  • 2020-03-06
  • 1970-01-01
  • 2014-12-02
  • 1970-01-01
  • 2012-06-29
相关资源
最近更新 更多