Онлайн компилятор C

#include <stdio.h> void lower_string(char s[]) { for(int i = 0; s[i] != '.' && s[i] != '\0';i++) { if (s[i] >= 'A' && s[i] <= 'Z') { s[i] = s[i]- 'A'; } } } int main() { char s[1000]= "AJdigrergig"; for(int i = 0; s[i] != '.' && s[i] != '\0';i++) { printf("%c", s[i]); } lower_string(s); for(int i = 0; s[i] != '.' && s[i] != '\0';i++) { printf("%c", s[i]); } return 0; }
这段代码试图将字符串中的大写字母转换为小写字母,但转换逻辑有误。当前代码将大写字母减去'A',得到的是0到25的数字,而不是对应的小写字母。

- 在 `lower_string` 函数中,转换公式 `s[i] = s[i] - 'A'` 是错误的。大写字母减去'A'得到的是字母在字母表中的位置(例如'A'变成0),而不是小写字母。应该加上小写字母'a'的ASCII值才能得到正确的小写字母。

- 主函数中的两个循环都使用了 `s[i] != '.'` 作为终止条件,但字符串中并没有句点。如果字符串中没有句点,循环会一直访问到字符串结束符'\0',但条件中检查了'\0',所以不会越界。不过这个条件设计可能不符合原意,需要确认是否真的需要以句点作为终止标志。