Online Compiler 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; } removeflag++; } 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),然后输出处理后的字符串。代码整体逻辑正确,但有一个潜在问题。

- 在 `main` 函数中,`getchar()` 的返回值类型是 `int`,但你把结果存入了 `char` 类型的变量 `b`。这会导致无法正确判断文件结束符 `EOF`,不过对于只读取换行符结束的输入,当前写法可以工作。更规范的写法是使用 `int` 类型接收 `getchar()` 的返回值。

- 另外,`removeletter` 函数中定义了一个局部数组 `removeresult[1001]`,如果输入的字符串长度超过 1000,可能会发生数组越界。不过题目限制输入长度不超过 1000,所以当前是安全的。