21人参与 • 2026-01-19 • C/C++
这是最直接且高效的方法之一。其核心思路是循环调用 strchr 函数,每次从上一次找到的位置之后开始新的搜索,直到找到第 i 次出现的字符。
函数原型与思路:strchr 函数用于查找字符在字符串中首次出现的位置,返回指向该字符的指针。我们可以利用它来迭代查找第 i 次出现:
strchr 查找目标字符。i 次,则将搜索起点更新为本次找到位置的下一个字符,继续循环。i 次,则返回结果。示例代码实现:
#include <stdio.h>
#include <string.h>
char *my_strnchr(const char *str, int ch, int which) {
char *result = null;
const char *search_start = str; // 搜索起始位置
// 循环查找第 which 次出现
while (which > 0 && (result = strchr(search_start, ch)) != null) {
which--;
if (which == 0) {
// 找到了第 which 次出现
return result;
}
// 为下一次查找更新起点
search_start = result + 1;
}
// 如果未找到足够次数的字符,返回 null
return null;
}
int main() {
char string[] = "192.168.0.199";
char *pos = my_strnchr(string, '.', 3);
if (pos != null) {
printf("第3次出现的位置(指针偏移): %ld\n", pos - string);
printf("从该位置开始的子串: %s\n", pos);
} else {
printf("未找到第3次出现的字符。\n");
}
return 0;
}此方法简洁高效,直接利用了标准库的优化。
如果不希望依赖标准库函数,或者需要在查找过程中进行更复杂的操作,可以手动遍历字符串。这种方法更直观,也便于初学者理解字符串的存储结构。
实现方法:
通过循环(for 或 while)逐个字符比较,并维护一个计数器,当计数器达到 i 时,返回当前位置。
示例代码(使用数组索引):
#include <stdio.h>
char *find_char_nth(const char *str, char ch, int n) {
int count = 0;
for (int i = 0; str[i] != '\0'; i++) {
if (str[i] == ch) {
count++;
if (count == n) {
// 返回指向该字符的指针
return (char *)(str + i);
}
}
}
return null;
}示例代码(使用指针操作):
#include <stdio.h>
char *find_char_nth_ptr(const char *str, char ch, int n) {
const char *p = str;
int count = 0;
while (*p != '\0') {
if (*p == ch) {
count++;
if (count == n) {
return (char *)p;
}
}
p++;
}
return null;
}手动遍历的优点是逻辑清晰,完全掌控流程,但代码量稍多于直接调用库函数。
strchr)通常效率很高,因为标准库函数经过了高度优化。方法二(手动遍历)在只需要单次查找时也很高效,但如果需要查找所有出现位置,手动遍历只需一次循环,可能更有优势。\0 结尾,否则会导致未定义行为(如内存越界访问)。str 为 null 或 "")。i 小于等于0。i 次。在这些情况下,函数应返回 null。找到的指针 - 字符串起始指针 来计算,如 pos - str。查找字符第 i 次出现的位置在实际编程中非常有用,例如:
"192.168.1.1",通过查找第3个点号来区分主机和网络部分。strrchr 查找最后一个分隔符(/ 或 \)来分离文件名和目录路径。查找第 i 次出现是其功能的扩展。以上就是c语言中查找字符在字符串中第n次出现位置的几种方法的详细内容,更多关于c语言查找字符第n次出现位置的资料请关注代码网其它相关文章!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论