"for ( ; *p; ++p) *p = tolower(*p);" 如何在 c 中工作?

How does "for ( ; *p; ++p) *p = tolower(*p);" work in c?

我对编程还很陌生,只是想知道为什么这段代码:

for ( ; *p; ++p) *p = tolower(*p);

当 p 指向一个字符串时,可以降低 c 中字符串的大小写吗?

要取消选择,我们假设 p 是指向 char 的指针,并且就在 for 循环之前,它指向字符串中的第一个字符。

在 C 中,字符串通常由一组连续的 char 值建模,最后添加一个 0 作为 null 终止符.

一旦达到字符串 null-terminator

*p 将评估为 0。然后 for 循环将退出。 (for 循环中的第二个表达式充当终止测试)。

++p 前进到字符串中的下一个字符。

*p = tolower(*p) 将该字符设置为小写。

一般来说,这段代码:

for ( ; *p; ++p) *p = tolower(*p);

works to lower a string case in c, when p points to a string?

它确实适用于纯 ASCII,但由于 char 通常是有符号类型,并且由于 tolower 需要非负参数(特殊值 EOF 除外),该作品通常会有未定义的行为。

为避免这种情况,将参数转换为 unsigned char,如下所示:

for ( ; *p; ++p) *p = tolower( (unsigned char)*p );

现在它可以用于 Latin-1 等单字节编码,前提是您通过 setlocale 设置了正确的语言环境,例如setlocale( LC_ALL, "" );。但是,请注意,非常常见的 UTF-8 编码不是每个字符一个字节。要处理 UTF-8 文本,您可以将其转换为宽字符串并将其小写。


详情:

  • *p 是表示 p 指向的对象的表达式,大概是 char.

  • 作为 for 循环的继续条件,*p 表示的任何非零 char 值都具有逻辑 True 的效果,而字符串末尾的零 char 值具有逻辑假的效果,结束循环。

  • ++p将指针前进指向下一个char.