在线编译器 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; } } } 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; }
这段代码的目的是从输入的字符串中删除所有元音字母(a, e, i, o, u, y 以及它们的大写形式),然后输出处理后的字符串。

代码中存在几个问题:

- 在 `is_letter` 函数中,`while` 循环第一次迭代时,无论 `a` 是否等于 `*removeflag`,都会立即返回 0 或 1,导致循环只检查了第一个字符 'a',而不会继续检查其他元音字母。这会导致函数无法正确判断字符是否为元音。

- 在 `removeletter` 函数中,调用 `copy(*removeresult, *a)` 时,传递的是数组首元素的值(即 `removeresult[0]` 和 `a[0]`),而不是数组的地址。`copy` 函数期望接收字符指针,这里传入了字符本身,会导致编译错误或未定义行为。

- 另外,`is_letter` 函数名容易让人误解为“判断是否为字母”,但实际功能是判断是否为元音字母,建议考虑更清晰的命名。