我对编程相当陌生,我只是想知道为什么这些代码:
for ( ; *p; ++p) *p = tolower(*p);当p指向字符串时,可以降低c中的字符串情况?
发布于 2015-06-05 07:11:11
要取消选择,让我们假设p是指向char的指针,就在for循环之前,它指向字符串中的第一个字符。
在C中,字符串通常由一组连续的char值建模,最后添加一个0作为空终止符。
一旦到达字符串null终止符,*p将计算为0。然后for循环将退出。( for循环中的第二个表达式充当终止测试)。
++p前进到字符串中的下一个字符。
*p = tolower(*p)将该字符设置为小写。
发布于 2015-06-05 07:19:37
一般来说,这一守则:
for ( ; *p; ++p) *p = tolower(*p);不会
当p指向字符串时,“可以降低c中的字符串情况?
它确实适用于纯ASCII,但是由于char通常是一个有符号类型,而且由于tolower需要一个非负参数(除了特殊值EOF),所以这个片段通常会有未定义的行为。
为了避免这种情况,将参数转换为unsigned char,如下所示:
for ( ; *p; ++p) *p = tolower( (unsigned char)*p );现在,只要您已经通过setlocale (例如setlocale( LC_ALL, "" ); )设置了正确的区域设置,它就可以用于拉丁-1这样的单字节编码。但是,请注意,非常常见的UTF-8编码并不是每个字符的一个字节.要处理UTF-8文本,可以将其转换为宽字符串和小写。
详细信息:
*p是一个表达式,表示p指向的对象,大概是char。for循环的一个延续条件,任何*p表示的非零char值都具有逻辑真的效果,而字符串末尾的零char值具有逻辑假的效果,结束了循环。++p将指针提前指向下一个char。https://stackoverflow.com/questions/30660401
复制相似问题