【发布时间】:2020-11-04 21:37:03
【问题描述】:
我正在尝试理解作为指针的黑色巫术魔法,但我无法理解以下情况。 我对getline()的第一个参数的理解比较笨拙,所以我想这都归结为它的类型,这与第二个例子中的单词不同。
以下是加载文件(单词字典)并逐行读取其内容的函数的摘录。为什么 tolower() 在第一个示例中起作用:
int l;
size_t len = 0;
char *word = NULL;
while ((l = getline(&word, &len, fp)) != -1)
{
for (char *p = word; *p; ++p) *p = tolower(*p);
// Irrelevant code below
}
但是在第二个示例中,在尝试从第一个字符分配 tolower() 的返回值之后,出现了段错误:
char *word = "POTATO";
for (char *p = word; *p; ++p) *p = tolower(*p);
【问题讨论】:
-
顺便提一下,当
p的类型是char *时,使用tolower((unsigned char) *p)而不是tolower(*p)。当*p为负但不是EOF时,C 标准未定义tolower的行为,并且在某些C 实现中char的值可能为负。
标签: c undefined-behavior c-strings string-literals tolower