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

C语言元音辅音统计程序无法保存文本写入内容问题求助

C语言文件读写及元音辅音统计问题修复

现有代码问题点

  • 未写入用户输入到文件:通过fgets拿到用户输入内容后,没有调用写入接口将内容写入已打开的文件,导致内容无法保存。
  • 文件名不匹配:首次打开的文件名为arquivoapenas.txt,读取时错写为带空格的arquivo apenas.txt,无法定位到目标文件。
  • 文件操作流程错误:首次打开的文件写入完成后未调用fclose关闭,直接重新赋值文件指针造成资源泄漏,同时缓冲区内容未刷入磁盘也会导致写入丢失。
  • while循环语法错误:while(fgets(c, 20, arq) != NULL);末尾多了分号,导致循环体为空,遍历文件内容的逻辑完全失效。
  • 统计逻辑缺陷:统计动作放在循环外,只会统计最后一次读到的内容;且未判断字符是否为英文字母,空格、数字、标点等非字母字符会被误统计为辅音。

修复后代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int main()
{
    FILE *arq;
    char c[80];
    int consoantes = 0, vogais = 0, i, k;
    // 打开文件用于写入,需保留原有内容可将w改为a
    arq = fopen("arquivoapenas.txt", "w");

    if(arq){
        printf("informe qualquer coisa ae:\n");
        fgets(c, 80, stdin);
        // 将用户输入写入文件
        fputs(c, arq);
        // 关闭文件,将缓冲区内容刷入磁盘
        fclose(arq);
    }
    else{
        printf("não foi possivel criar o arquivo\n");
        return 1;
    }

    system("pause");

    // 打开正确文件名读取内容
    arq = fopen("arquivoapenas.txt", "r");
    if(arq == NULL){
        printf("无法打开文件读取\n");
        return 1;
    }

    // 去掉末尾多余分号,循环读取每行内容
    while(fgets(c, 80, arq) != NULL){
        printf("%s", c);
        k = strlen(c);
        for(i = 0; i < k; i++){
            // 非字母字符跳过统计
            if(!isalpha(c[i])){
                continue;
            }
            // 统一转小写减少case数量
            switch(tolower(c[i])){
                case 'a':
                case 'e':
                case 'i':
                case 'o':
                case 'u':
                    vogais++;
                    break;
                default:
                    consoantes++;
            }
        }
    }

    printf("\nVogais: %d\n", vogais);
    printf("Consoantes: %d\n", consoantes);

    fclose(arq);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 19:06:01