在线编译器 C

#include <stdio.h> int my_length(char c[]) { int len = 0; int i = 0; while (c[i] != '\0') { len++; i++; } return len; } int is_letter(char a) { char *removeflag = "aeiouyAEIOUY"; while (!*removeflag) { if (a == *removeflag) { return 1; } else { return 0; } } return 0; } void copy(char *from, char *to) { int size = my_length(from); for (int i = 0; i < size; i++) { to[i] = from[i]; } to[size] = '\0'; } void removeletter(char *a) { int size = my_length(a); char removeresult[1001] = {0}; int r_i = 0; for (int i = 0; i < size; i++) { if (!is_letter(a[i])) { removeresult[r_i] = a[i]; r_i++; } } copy(removeresult, a); return; } int main() { char a[1001]; int i = 0; char b; while (i < 1000 && (b = getchar()) != '\n') { a[i] = b; i++; } a[i] = '\0'; removeletter(a); printf("%s", a); return 0; }
这段代码的目的是从输入的字符串中删除所有英文字母(包括大小写),然后输出结果。代码整体结构正确,但 `is_letter` 函数存在逻辑错误,导致无法正确判断字符是否为字母。

- 在 `is_letter` 函数中,`while (!*removeflag)` 这个条件写错了。`!*removeflag` 在 `removeflag` 指向的字符不是 `'\0'` 时值为0(假),所以循环体永远不会执行。你应该检查 `*removeflag` 是否为 `'\0'` 来遍历字符串,而不是用 `!` 取反。另外,循环内部直接返回了,导致只检查了第一个字符就结束,没有遍历整个字母表。

- 当 `is_letter` 返回1时表示是字母,但你的 `removeletter` 函数中 `if (!is_letter(a[i]))` 的意思是“如果不是字母则保留”,这与函数命名和逻辑一致,但需要确保 `is_letter` 正确工作。