You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

手动统计字符串字符数时出现无限循环(不使用内置函数),如何解决?

解决你的字符串计数无限循环问题

嘿,我来帮你排查这个无限循环的问题!你的代码核心问题出在循环条件的逻辑错误上,咱们一步步拆解:

问题根源

你的循环写的是:

while (ptr != null) { ... }

这里有两个致命问题:

  1. null不是C/C++的合法标识符:C里应该用NULL,C++11及以后推荐用nullptr,直接写null会导致编译器报错。
  2. 循环逻辑完全错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:24:57