“for(; * p; ++ p)* p = tolower(* p);”在c工作?

时间:2015-06-05 07:08:37

标签: c pointers lowercase

我对编程很新,只是想知道为什么这个代码:

for ( ; *p; ++p) *p = tolower(*p);
当p指向字符串时,

用于降低c中的字符串大小写?

2 个答案:

答案 0 :(得分:3)

一般来说,这段代码:

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

  当p指向字符串时,

是否可以降低c中的字符串大小写?

它适用于纯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循环的延续条件,char表示的任何非零*p值都具有逻辑真的效果,而零{{1字符串末尾的值具有逻辑False的效果,结束循环。

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

答案 1 :(得分:2)

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

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

一旦到达字符串 null-terminator

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

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

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