C语言 在字符串中查找字符的函数[关闭]

9lowa7mx  于 2023-10-16  发布在  其他
关注(0)|答案(3)|浏览(119)

**已关闭。**此问题需要debugging details。它目前不接受回答。

编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将帮助其他人回答这个问题。
17天前关闭
Improve this question

int charfind(char* str, char c, int start) {
    int index = -1;
    for (size_t i = start; i <= strlen(str); i++) {
        if (str[i] == c) {
            index = i;
            break;
        }
    }
    return index;
}

我尝试将参数改为unsigned chars和int,并尝试同时提供字符字面量和非符号字符的数字,但它总是返回-1。
在我看来,这似乎表明if语句的计算结果永远不会为true。

irlmq6kh

irlmq6kh1#

你还没有展示如何使用这个功能。如果调用者行为良好,没有传递垃圾值,那么您所编写的应该可以工作。
为了您的利益,这里有另一种选择:

int charfind( char *str, char c, size_t idx ) {
    if( str == NULL || c == 0 )
        return -1;

    for( ; idx && *str; idx-- )  // cautiously advance to start position
        str++;

    for( ; *str; idx++ ) // while not at end of string
        if( *str++ == c ) // if characters match
            return idx; // early termination

    return -1; // not found
}

注意,第三个参数现在是size_t类型。对于初学者来说,传递内存地址并允许负偏移的可能性是不明智的。

jecbmhm3

jecbmhm32#

我正在尝试创建一个函数来在C中查找字符串中的字符。我做错了什么?

测试良好,直到<= strlen()

这就是strchr()所做的。“终止空字符被认为是字符串的一部分."。这允许charfind(s, '\0', 0)返回非1结果。

比对类型错误

str...()的功能就像字符是unsigned char一样,即使char是 * 有符号的 *。在这里推荐同样的。

接口过于复杂

int charfind(char* str, char c, int start)没有什么意义,因为调用者可以使用charfind(str + start, c)调用

intsize_t索引

字符串长度可以超过INT_MAXsize_t是字符串索引的最佳类型。
long charfind(char* str, char c, size_t start) {为例。
然而,如果删除不需要的start参数,这就没有意义了。

返回值

而不是int,考虑返回一个指向定位位置的指针,如果找不到则返回NULL
如果坚持一个索引,考虑更广泛的类型。

避免重复呼叫

而不是每次在for()循环中使用strlen()

while (*str != c && *str != '\0') {
  str++;
}
if (*str == c) {
  return str;
}
return NULL;
}

使用const

这允许使用const字符串。
全部在一起(仍然返回一个位置索引)

#include <stdlib.h>
#include <string.h>
long charfind(const char *str, int c, size_t start) {
  long position = -1;

  // Search 0 to start-1 for a null character and hope to not find it
  // as that means string is long enough to find a match.
  if (memchr(str, '\0', start) == NULL) {
    unsigned char uc = (unsigned char) c;
    const unsigned char *ustr = (const unsigned char*) str + start;

    // Search until match found or end of string.
    while (*ustr != uc && *ustr != '\0') {
      ustr++;
    }

    // Did above loop stop due to a match?
    if (*ustr == uc) {
      position = (long) (ustr - (const unsigned char*) str);
    }
  }
  return position;
}
nfg76nw0

nfg76nw03#

我建议的唯一修改是for循环条件。在代码中,strlen将在每次迭代中被调用。另外,条件应该是<,因为你不是在寻找C字符串终止字符。

int charfind(char* str, char c, size_t start) 
{
    int index = -1;
    for (size_t i = start; str[i]; i++) {
        if (str[i] == c) {
            index = i;
            break;
        }
    }
    return index;
}

https://godbolt.org/z/Kfs8hvW5d
您还可以添加一些检查:

int charfind(char* str, char c, size_t start) 
{
    int index = -1;
    if(str && start < strlen(str))
    {
        for (size_t i = start; str[i]; i++) {
            if (str[i] == c) {
                index = i;
                break;
            }
        }
    }
    return index;
}

相关问题