gpt4 book ai didi

c - 为什么循环会这样工作?

转载 作者:行者123 更新时间:2023-11-30 20:04:21 26 4
gpt4 key购买 nike

我创建了一个程序。它按照我想要的方式工作,但我不明白为什么。

这就是函数。

void LiteraMajuscula(char *str)
{
int i;

i = 0;
while (str[i] != '\0')
{
if (i == 0 && str[i] >= 'a' && str[i] <= 'z')
str[i] -= 32;
if (str[i-1] == ' ' && str[i] >= 'a' && str[i] <= 'z')
str[i] -= 32;
i++;
}
}

每当有空格且只有第一个字符时,应该将小写字符转换为大写字符,如果字符串中的第一个字符为小写,则将其转换为大写。

我唯一不明白的是str[i-1]。我尝试了 str[i],但它没有改变任何内容,并且 str[i-2] 将第二个字母更改为大写,而不是第一个字母。这是为什么?

最佳答案

str[i] -= 32; 将转换索引 i 处的字符。第二个 if 语句在检查中使用 str[i-1] == ' ' 的原因是它知道当前字符(位于 i code>) 就在一个空格之后(在 i - 1 处)。当您将其更改为 str[i-2] == ' ' 时,它会转换单词的第二个字符,原因是您更改了它,因此它会转换一个字符,如果它(在 i 处)是空格后的两个 个字符(在 i-2 处)。

正如评论中所指出的,那里的代码有未定义的行为,因为当 i0,因此 str[i-1] 将访问 str 指向的之前字符。

另外,由于大多数条件和逻辑在两个 if 之间都是重复的,因此您可以在此处使用 ||(逻辑 OR):

while (str[i] != '\0')
{
if ((i == 0 || str[i-1] == ' ') && str[i] >= 'a' && str[i] <= 'z')
str[i] -= 32;
i++;
}

(请注意 || 周围的 ()。)

|| 短路,因此当 i0 且第一个操作数为 true 时,第二个操作数 (str [i-1] == ' ') 永远不会被评估,因此您可以避免未定义的行为。

关于c - 为什么循环会这样工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41445783/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com