Онлайн компилятор 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<size;i++){ c[i]=result[i]; } c[t]='\0'; } 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; }
这段代码的功能是从输入中读取字符,然后删除所有元音字母(包括大小写),最后输出处理后的结果。代码整体思路正确,但存在几个问题。

- 在 `clear` 函数中,将 `result` 数组复制回 `c` 时,循环条件使用了 `size`(原字符串长度),但 `result` 的有效长度可能小于 `size`,这会导致复制多余的空字符或未初始化的数据到 `c` 中。应该只复制 `result` 中实际有效的字符,即 `t` 个字符。

- `sum` 函数计算的是字符串长度,但变量名 `sum` 容易与求和混淆,不过这不是错误。另外,`clear` 函数中 `int size=sum(c)` 每次调用都会重新计算长度,效率较低,但功能正确。