You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言使用scanf、printf移除元音时换行符丢失问题求解

问题根因
  • 你使用%*c直接丢弃了输入每行末尾的换行符,处理完当前行内容后也没有主动输出对应的换行符,自然所有行的输出会连在一起。
  • %[^\n]的匹配规则为仅当当前读取位置不是换行符时才会匹配成功,遇到空行(行首就是换行符)时匹配直接失败,scanf返回0而非EOF,此时不仅空行会被直接跳过,剩余的换行符也不会被%*c消费,会导致后续读取逻辑异常。
  • 存在小的边界风险:你声明的input数组长度为128,但scanf中写的是%99[^\n],长度不匹配,极端情况下可能出现缓冲区问题。
修复方案

修改main函数的循环逻辑即可,修改后的参考代码如下:

int main(void) {
    char input[128];
    char vowels[] = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'};
    int ret;
    
    while ((ret = scanf("%127[^\n]", input)) != EOF) {
        if (ret == 1) {
            check_and_print_consonants(input, vowels);
        }
        // 消费当前行末尾的换行符,同时输出换行对齐输入格式
        getchar();
        printf("\n");
    }
    return 0;
}
可选优化

你当前的字符检查逻辑每次都要遍历完所有10个元音字符,可以在匹配到元音后直接break跳出内层循环,减少不必要的计算:

void check_and_print_consonants(char string1[], char string2[]) {
     int str1_len = strlen(string1);
     int str2_len = 10;
     for (int i = 0; i < str1_len; i++) {
         int vowel = 0;
         for (int j = 0; j < str2_len; j++) {
             if (string1[i] == string2[j]) {
                  vowel = 1;
                  break;
             }
         }
         if(vowel == 0){
            printf("%c", string1[i]);
         }
     }
}

内容的提问来源于stack exchange,提问作者ferocioussprouts

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 15:48:02