首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"for (;*p;++p) *p = tolower(*p);“如何在c中工作?

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

Stack Overflow用户
提问于 2015-06-05 07:08:37
回答 2查看 290关注 0票数 5

我对编程相当陌生,我只是想知道为什么这些代码:

代码语言:javascript
复制
for ( ; *p; ++p) *p = tolower(*p);

当p指向字符串时,可以降低c中的字符串情况?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-05 07:11:11

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

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

一旦到达字符串null终止符,*p将计算为0。然后for循环将退出。( for循环中的第二个表达式充当终止测试)。

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

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

票数 2
EN

Stack Overflow用户

发布于 2015-06-05 07:19:37

一般来说,这一守则:

代码语言:javascript
复制
for ( ; *p; ++p) *p = tolower(*p);

不会

当p指向字符串时,可以降低c中的字符串情况?

它确实适用于纯ASCII,但是由于char通常是一个有符号类型,而且由于tolower需要一个非负参数(除了特殊值EOF),所以这个片段通常会有未定义的行为。

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

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30660401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档