为何使用strlen(sentence) - 1作为条件时while循环无法执行?
为何使用strlen(sentence) - 1作为条件时while循环无法执行?
嘿,我来帮你拆解下这个问题~
首先先明确你的场景:你要实现的功能是反转输入短语中长度等于最长单词的那些词,输入字符串是#Voi#da#bacu#la#info#,预期输出里bacu和info这两个最长(长度为4)的词被反转成了ucab和ofni,逻辑本身是没问题的。
那为什么换成while (position < strlen(sentence) - 1)后循环直接不执行了?核心问题出在strlen函数的特性上:
strlen的工作原理是从字符串的起始地址开始,逐个字节扫描,直到遇到第一个**空字符\0**才停止,返回扫描过的字符数。- 而你原来用的
sentenceLength应该是预先计算好的字符串实际有效长度(比如你数过输入字符串的字符数,是确定的数值),它不会受字符串是否有终止符的影响。
那循环不执行的大概率原因是:你的sentence字符串没有正确以\0结尾!这会导致strlen的计算结果完全不可靠——要么它会一直读到内存里的垃圾数据,返回一个远大于实际长度的数值(但这种情况循环会多跑),要么刚好在有效字符之前就遇到了内存里的\0,返回一个极小的数值(比如0),这时候strlen(sentence)-1就变成了-1,而你的position初始值应该是0,0 < -1不成立,循环直接跳过。
另外还有个小细节:就算字符串有正确的终止符,每次循环调用strlen(sentence)也会重复扫描整个字符串,带来不必要的性能开销,不如用预先计算好的sentenceLength来得高效。
给你两个小建议:
- 确保你的字符串数组在初始化或赋值时,末尾一定要加上
\0终止符; - 对于需要多次使用的字符串长度,提前计算并存到变量里,避免反复调用
strlen。
备注:内容来源于stack exchange,提问作者Mihai
相关产品推荐
相关产品推荐

