手动统计字符串字符数时出现无限循环(不使用内置函数),如何解决?
解决你的字符串计数无限循环问题
嘿,我来帮你排查这个无限循环的问题!你的代码核心问题出在循环条件的逻辑错误上,咱们一步步拆解:
问题根源
你的循环写的是:
while (ptr != null) { ... }
这里有两个致命问题:
null不是C/C++的合法标识符:C里应该用NULL,C++11及以后推荐用nullptr,直接写null会导致编译器报错。- 循环逻辑完全错误:
ptr一开始指向buffer的起始地址,每次ptr++只会让指针往后移动,永远不会变成空指针(除非越界访问到内存的某个特殊位置,但那是未定义行为),所以这个循环永远不会终止,自然陷入无限循环。
C/C++里的字符串是以空字符'\0'作为结束标记的,手动统计字符数的正确逻辑应该是:遍历字符串,直到遇到'\0'就停止,统计之前走过的字符数量。
修正后的代码
#include <iostream> #include <cstdio> int main() { char buffer[255] = { 0 }; sprintf_s(buffer, "hello world"); char* ptr = buffer; int count = 0; // 检查当前指针指向的字符不是结束符 while (*ptr != '\0') { count++; ptr++; } std::cout << count << std::endl; std::cin.get(); return 0; }
关键修改点说明
- 把循环条件从
ptr != null改成了*ptr != '\0':*ptr表示指针当前指向的字符,当这个字符是'\0'时,说明已经到了字符串末尾,停止循环。 - 补充了必要的头文件
#include <iostream>和#include <cstdio>,避免编译报错。 - 加上了
return 0;,符合C++main函数的规范。
额外小贴士
- 这其实就是标准库函数
strlen的底层实现逻辑:从字符串起始地址开始遍历,计数直到遇到'\0'为止。 - 你初始化
buffer时用了{0},这会把整个数组都置为0,所以即使sprintf_s写入的字符串长度小于255,后面的位置都是'\0',不用担心越界读取的问题。
内容的提问来源于stack exchange,提问作者Nib
相关产品推荐
相关产品推荐

