在C语言中理解strlen函数

5

我正在学习C语言。我看到了这个函数,可以找到一个字符串的长度。

size_t strlen(const char *str) 
{ 
 size_t len = 0U; 
 while(*(str++)) ++len; return len; 
}

现在,循环什么时候结束?我有点困惑,因为str++会一直增加指针。

FYI:阅读Kerningham和Richie的著作。他们引入了这种编程风格。但是需要注意的是,永远不要在商业应用中使用这种风格。 - Manoj R
我有那本书,但是首先要使用其他资源来熟悉 C :) - jess
@user439578:任何风格与应用程序类型有什么关系?只需使用您喜欢的风格,并在提交代码之前进行缩进(使用公司规定的风格)。 - pmg
5个回答

12
while(*(str++)) ++len;

等同于:

while(*str) {
 ++len;
 ++str;
}

就相当于:

while(*str != '\0') {
 ++len;
 ++str;
}

现在你可以看到当 str 指向字符串末尾的 null 字符时,测试条件失败并停止循环。


1
“is same as:”除了str的最终值外,在这种情况下它没有被使用。 - Steve Jessop

10
  1. C字符串以值为0NUL字符结尾。
  2. false在C中表示为0,其他任何值都表示true

因此,我们不断将指针增加到字符串和长度,直到找到一个NUL字符,然后返回。


我知道第一个点。第二个让它更清晰了!谢谢 - jess
1
我对你的回答很满意,但是不需要提及ASCII会更好。在任何编码下,nul都保证是0 - Jens Gustedt
根据您的建议,@Jens已进行修改。 - doron

2

要理解这个函数的概念,您需要了解两个概念:

1°)C字符串是字符数组。

2°)在C中,数组变量实际上是指向表格第一个元素的指针。

那么strlen函数是做什么的?它使用指针算术运算来解析表格(指针上的++表示:下一个元素),直到它到达结束信号("\0")。


字符表?您是指字符数组吗? - Manoj R
1
是的。我在英语中总是犯这个错误(在法语中,我们用“tableau”表示“array”,所以我倾向于使用“table”)。 - Raveline

0

一旦*(str++)返回0,循环就会退出。这将在str指向字符串的最后一个字符时发生(因为C语言中的字符串是以0结尾的)。


0

没错,str++ 增加计数器并返回先前的值。星号 (*) 解引用指针,即它给出字符值。

C 字符串以零字节结尾。当条件不再为真时,即为零时,while 循环退出。

因此,while 循环运行直到在字符串中遇到零字节为止。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接