"for ( ; *p; ++p) *p = tolower(*p);" 如何在 c 中工作?
How does "for ( ; *p; ++p) *p = tolower(*p);" work in c?
我对编程还很陌生,只是想知道为什么这段代码:
for ( ; *p; ++p) *p = tolower(*p);
当 p 指向一个字符串时,可以降低 c 中字符串的大小写吗?
要取消选择,我们假设 p
是指向 char
的指针,并且就在 for
循环之前,它指向字符串中的第一个字符。
在 C 中,字符串通常由一组连续的 char
值建模,最后添加一个 0 作为 null 终止符.
一旦达到字符串 null-terminator,*p
将评估为 0。然后 for
循环将退出。 (for
循环中的第二个表达式充当终止测试)。
++p
前进到字符串中的下一个字符。
*p = tolower(*p)
将该字符设置为小写。
一般来说,这段代码:
for ( ; *p; ++p) *p = tolower(*p);
不
” works to lower a string case in c, when p points to a string?
它确实适用于纯 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
值具有逻辑假的效果,结束循环。
++p
将指针前进指向下一个char
.
我对编程还很陌生,只是想知道为什么这段代码:
for ( ; *p; ++p) *p = tolower(*p);
当 p 指向一个字符串时,可以降低 c 中字符串的大小写吗?
要取消选择,我们假设 p
是指向 char
的指针,并且就在 for
循环之前,它指向字符串中的第一个字符。
在 C 中,字符串通常由一组连续的 char
值建模,最后添加一个 0 作为 null 终止符.
*p
将评估为 0。然后 for
循环将退出。 (for
循环中的第二个表达式充当终止测试)。
++p
前进到字符串中的下一个字符。
*p = tolower(*p)
将该字符设置为小写。
一般来说,这段代码:
for ( ; *p; ++p) *p = tolower(*p);
不
” works to lower a string case in c, when p points to a string?
它确实适用于纯 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
值具有逻辑假的效果,结束循环。++p
将指针前进指向下一个char
.