我对编程很新,只是想知道为什么这个代码:
for ( ; *p; ++p) *p = tolower(*p);
当p指向字符串时,用于降低c中的字符串大小写?
答案 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终止符。
*p
将评估为0。然后for
循环将退出。 (for
循环中的第二个表达式用作终止测试。)
++p
前进到字符串中的下一个字符。
*p = tolower(*p)
将该字符设置为小写。