Онлайн компилятор C

#include <stdio.h> #include <string.h> int isVowel(char s) { char* vowels = "aeoiuAEOIU"; if (strchr(vowels, s) != NULL) { return 1; } return 0; } int main(void) { char s[1005] = {0}; scanf("%[^\n]", s); for (int i = 0; s[i] != '\0'; i++) { if (!isVowel(s[i])) { putchar(s[i]); } } printf("\n"); return 0; }
这段代码的功能是:读取一行字符串,然后输出其中所有非元音字母的字符(即删除元音字母 a、e、i、o、u 及其大写形式)。

代码整体逻辑正确,但有一个小问题需要注意:

- 在 `isVowel` 函数中,你定义的元音字符串 `"aeoiuAEOIU"` 缺少了字母 `y` 和 `Y`,不过通常元音只包括 a、e、i、o、u,所以这里没问题。但要注意拼写顺序:你写的是 `"aeoiu"`,而常见顺序是 `"aeiou"`,不过这不影响功能。

- 主要问题在于:`scanf("%[^\n]", s)` 这种读取方式存在缓冲区溢出的风险,因为如果输入超过 1004 个字符,会超出数组 `s` 的大小。建议使用更安全的输入方式,比如 `fgets`。

- 另外,`isVowel` 函数参数类型是 `char`,但 `strchr` 期望的是 `int`,虽然 `char` 可以自动转换,但最好保持类型一致。