C语言strchr(s,oldch)作用及while(s=strchr(s,oldch))用法详解
C语言
strchr相关代码逻辑讲解 1. strchr 基础功能
strchr是C标准库<string.h>中提供的字符串处理函数,函数原型为char *strchr(const char *str, int c),作用是从str指向的字符串首地址开始,从左向右查找第一个ASCII值等于c的字符:
- 查找成功:返回指向该匹配字符的指针
- 查找失败:返回空指针
NULL
2. while (s = strchr(s, oldch))的含义与执行逻辑
这行代码是把赋值操作直接写在循环判断条件里,C语言中赋值表达式的返回值就是赋值后左操作数的值,所以整个判断逻辑可以拆成两步:
- 调用
strchr(s, oldch)查找当前s指向位置之后第一个匹配oldch的字符,把返回的指针赋值给s - 判断赋值后的
s是否为非NULL(即是否查找成功),非NULL则进入循环体,否则退出循环
完整执行流程
配合你提供的replace函数上下文,整体运行逻辑如下:
- 函数刚进入时,
s指向传入字符串的首地址,nrep替换计数初始化为0 - 第一次进入循环判断:调用
strchr从字符串开头找第一个oldch- 若返回
NULL:说明字符串中没有匹配字符,s赋值为NULL,循环条件不成立,直接返回0 - 若返回非
NULL:s现在指向第一个匹配的oldch位置,进入循环体
- 若返回
- 循环体执行:
*(s++) = newch,先把s当前指向的oldch修改为newch,再把s指针向后移动1字节(指向匹配字符的下一个位置),同时nrep计数加1 - 回到循环判断步骤,从新的
s位置开始继续查找下一个oldch,重复步骤2-3,直到strchr返回NULL,循环结束,返回替换次数
注意:这里条件内是赋值操作符
=而非比较操作符==,是初学者容易写错的点。如果想避免编译器的歧义警告,可以给赋值表达式加一层括号:while ((s = strchr(s, oldch)) != NULL),逻辑完全等价。
3. 等价写法
写法1:拆分赋值与判断,避免歧义
这种写法把赋值和判断拆开,可读性更高,也不会触发编译器对「条件内赋值」的警告,逻辑完全等价:
int replace(char *s, char oldch, char newch) { int nrep = 0; char *match_ptr; while (1) { match_ptr = strchr(s, oldch); if (match_ptr == NULL) { break; } *match_ptr = newch; s = match_ptr + 1; nrep++; } return nrep; }
写法2:不使用strchr,手动遍历字符串
如果不用标准库函数,自己逐个字符遍历实现的逻辑也是等价的,更适合初学者理解底层原理:
int replace(char *s, char oldch, char newch) { int nrep = 0; // 遍历到字符串结束符'\0'为止 for (int i = 0; s[i] != '\0'; i++) { if (s[i] == oldch) { s[i] = newch; nrep++; } } return nrep; }
用指针遍历的版本:
int replace(char *s, char oldch, char newch) { int nrep = 0; char *p = s; while (*p != '\0') { if (*p == oldch) { *p = newch; nrep++; } p++; } return nrep; }
内容的提问来源于stack exchange,提问作者shaila
相关产品推荐
相关产品推荐

