解析C语言字符串大写程序中指定while循环的执行逻辑
解析字符串单词首字母大写的C语言程序逻辑
我有一个能实现字符串所有单词首字母大写的C语言程序,程序可以正常运行,但我搞不懂代码的执行逻辑,尤其是这段while循环:
while (!(str[index] >= 'a' && str[index] <= 'z')){ index++; }
完整程序代码
#include <stdio.h> char *cap_string(char *str); int main(void) { char str[] = "Expect the best. Prepare for the worst. Capitalize on what comes.\nhello world! hello-world 0123456hello world\thello world.hello world\n"; char *ptr; ptr = cap_string(str); printf("%s", ptr); printf("%s", str); return (0); } char *cap_string(char *str) { int index = 0; while (str[index]) { while (!(str[index] >= 'a' && str[index] <= 'z')) index++; if (str[index - 1] == ' ' || str[index - 1] == '\t' || str[index - 1] == '\n' || str[index - 1] == ',' || str[index - 1] == ';' || str[index - 1] == '.' || str[index - 1] == '!' || str[index - 1] == '?' || str[index - 1] == '"' || str[index - 1] == '(' || str[index - 1] == ')' || str[index - 1] == '{' || str[index - 1] == '}' || index == 0) str[index] -= 32; index++; } return (str); }
核心循环解析
你疑惑的这段内层循环,作用是跳过所有非小写字母的字符,直到定位到第一个小写字母:
str[index] >= 'a' && str[index] <= 'z'判断当前字符是否为小写字母- 前面的
!取反,所以整个条件的意思是「当前字符不是小写字母」 - 只要满足该条件,就把
index自增,往后移动指针,直到碰到小写字母才停止循环
整体函数执行逻辑
cap_string函数是实现首字母大写的核心,流程如下:
- 初始化
index为0,从字符串起始位置开始遍历 - 外层
while (str[index]):只要当前字符不是字符串结束符'\0',就持续遍历 - 先执行内层循环,跳过所有非小写字母的字符,定位到第一个小写字母
- 判断该小写字母是否需要转为大写:
- 两种情况满足其一就转大写:
- 它是字符串的第一个字符(
index == 0) - 它的前一个字符是指定的分隔符(空格、制表符、换行,或是各种标点符号)
- 它是字符串的第一个字符(
- 转大写的方式是
str[index] -= 32——因为ASCII编码中,同一个字母的大写形式比小写形式的数值小32(比如'a' - 32 = 'A')
- 两种情况满足其一就转大写:
index++,继续往后遍历下一个字符
补充细节
- 这个程序的「单词分隔符」是硬编码的列表,只有在这些分隔符之后的小写字母才会被转为大写
- 存在局限性:如果小写字母前的字符不在分隔符列表里(比如数字、连字符
-),不会被转大写。比如示例字符串中的0123456hello,h的前一个字符是6,不在分隔符列表,所以不会转为大写 - 函数直接修改了传入的原字符串——因为C语言中字符串以字符数组形式存储,传参传递的是指针,所以修改会直接影响原数组,这也是
main函数中两次printf输出结果一致的原因
内容的提问来源于stack exchange,提问作者Katiana_de_Almeida
相关产品推荐
相关产品推荐

