C语言指针练习:字符串长度计算异常问题求助
搞定C语言指针字符串长度计算的Bug
嘿,我来帮你排查这个问题!先还原一下你可能写出的错误代码(毕竟输出长度为1的情况,基本都是循环逻辑和指针操作的双重失误):
int get_string_length(char *s) { int i = 1; // 这里犯了两个错:用赋值代替判断,还没正确检测字符串结束符 while (s = s + 1) { i++; } return i; }
问题出在哪?
- 循环条件完全写错了:你把字符串结束的判断逻辑搞混了,还误用了赋值运算符
=。s = s + 1只是把指针往后挪一位,返回的是新指针的地址——只要这个地址不是NULL(正常情况下都不会是),循环本应该一直跑,但你说返回值是1,说明循环只执行了一次就退出,这大概率是因为你误把对指针指向内容的判断,写成了对指针本身的判断,再加上初始的i值设错了。 - 指针移动和计数的时机不匹配:要求循环条件必须包含
s = s + 1的递增方式,那你得搞清楚:是先移动指针,还是先计数?字符串长度是从第一个字符算到'\0'前的最后一个字符,时机错了,计数肯定不对。
符合要求的正确代码
int get_string_length(char *s) { int i = 0; // 先移动指针,再判断当前指针指向的字符是不是非'\0' while (*(s = s + 1)) { i++; } // 注意:第一个字符没被计数,所以最后要加1 return i + 1; }
为啥这样就对了?
举个例子,比如你传入的是"Hello World!"(长度12):
- 初始时
s指向第一个字符'H',第一次循环执行s = s + 1,指针移到第二个字符'e',判断*(s)不为'\0',i加1; - 就这样一直循环,直到指针移到
'\0'的时候,*(s = s + 1)的结果是'\0'(布尔逻辑里是假),循环退出; - 这时候
i的值是11(因为从第二个字符开始数了11个),加1后正好是正确的长度12。
另一种可能的错误场景
如果你写的代码是这样的:
int get_string_length(char *s) { int i = 0; // 错把指针地址赋值给了当前字符,直接破坏了原字符串 while (*s = s + 1) { i++; } return i; }
这会把指针的地址值塞给当前指向的字符,不仅破坏了原字符串,而且第一次赋值后*s是个非零值(地址),i加1,但s根本没移动——不过你说返回1,可能是后续内存刚好碰到了0值,循环才停。这种情况的核心是把指针本身和指针指向的内容搞混了。
内容的提问来源于stack exchange,提问作者Alejandro Estrada
相关产品推荐
相关产品推荐

