【问题标题】:How does "for ( ; *p; ++p) *p = tolower(*p);" work in c?“for ( ; *p; ++p) *p = tolower(*p);”如何在 c 工作?
【发布时间】:2015-08-20 01:00:53
【问题描述】:

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

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

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

【问题讨论】:

  • 嗨。为什么你认为它不应该工作?\
  • 哪一部分你不明白?
  • 您好,我不确定 *p 如何用作 for 循环中的第二个参数,以及循环如何知道结束
  • @Dave 对于以'\0' 终止的字符串,*p 的计算结果为 '\0',用于中断循环的最后一个字符,对于继续循环的其他字符,计算结果为非零。
  • for 在到达*p==0 时终止执行。每个 C-String 都以 0 代码结束!

标签: c pointers lowercase


【解决方案1】:

一般来说,这段代码:

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 循环的延续条件,*p 表示的任何非零 char 值都具有逻辑 True 的效果,而在循环末尾的零 char 值string 具有逻辑 False 的效果,结束循环。

  • ++p 使指针前进以指向下一个char

【讨论】:

  • 这有点超前了,但我会试着坐下来理解它,干杯!
  • +1 表示挑剔(这很好,尤其是在 C 语言中)和提及编码,只是为了让 OP 记住它们就在身边。
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 啊,那是我不知道的一点,所以默认情况下,for循环的条件是如果第二个参数为0,那么它将退出?
  • 确实,for 循环中的第二个表达式是终止测试。
猜你喜欢
  • 2020-01-22
  • 2014-12-18
  • 1970-01-01
  • 1970-01-01
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 2012-08-30
  • 1970-01-01
相关资源
最近更新 更多