Online Compiler C

#include <stdio.h> int isvovel(char c) { char *vovel = "aeiouyAEIOUY"; while (*vovel) { if (c == *vovel) { return 1; } vovel++; } return 0; } int sum(char c[]) { int i = 0, sum = 0; while (c[i] != '\0') { sum++; i++; } return sum; } void clear(char c[]) { int size = sum(c), t = 0; char result[1001] = {0}; for (int i = 0; i < size; i++) { if (!isvovel(c[i])) { result[t++] = c[i]; } } result[t] = '\0'; for (int i = 0; i < t; i++) { c[i] = result[i]; } } int main() { char c[1001]; char a; int i = 0; while ((a = getchar()) != EOF) { c[i] = a; i++; } clear(c); printf("%s", c); return 0; }
这段代码的功能是:从标准输入读取字符,直到遇到文件结束符(EOF),然后删除所有元音字母(a、e、i、o、u、y,包括大小写),最后输出处理后的字符串。

代码中存在一个潜在问题,可能导致程序行为不符合预期。

- 在 `main` 函数中,读取字符后没有在数组末尾添加字符串结束符 `'\0'`。`sum` 函数依赖 `'\0'` 来判断字符串长度,但你的输入循环结束后,`c` 数组可能没有正确的结束标记,这会导致 `sum` 函数读取越界,结果不可预测。

- 另外,`clear` 函数中,你使用 `sum(c)` 获取长度,但此时 `c` 可能已经因为缺少 `'\0'` 而长度计算错误。同时,`clear` 函数内部创建了一个局部数组 `result`,但它的最大长度是固定的 1001,如果输入字符串很长,可能不够用。不过这不是主要问题。