转换并计算大写和小写字符

时间:2016-10-18 07:04:21

标签: c

我正在编写一个C程序,将所有大写字符转换为小写,并将所有小写字母转换为大写字母。

我还想计算读取的字符数和转换为大写字符的字符数以及转换为小写字符的字符数。

我能够转换字符,但无法弄清楚如何计算它们。

示例;

Hello World! 

输出

hELLO wORLD! 
  • 共阅读13个字符。
  • 8转换为大写。
  • 2转换为小写。

这是我的代码;

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

#define INPUT_FILE      "input.txt"
#define OUTPUT_FILE     "output.txt"

int main()
{
    FILE *inputFile = fopen(INPUT_FILE, "rt");
    if (NULL == inputFile) {
        printf("ERROR: cannot open the file: %s\n", INPUT_FILE);
        return -1;
    }

    // 2. Open another file
    FILE *outputFile = fopen(OUTPUT_FILE, "wt");
    if (NULL == inputFile) {
        printf("ERROR: cannot open the file: %s\n", OUTPUT_FILE);
        return -1;
    }
    int c;
    int ch;
    int upper = 0;
    int lower = 0;
    int count = 0;
    while (EOF != (c = fgetc(inputFile))) {
        ch = islower(c)? toupper(c) : tolower(c);
        fputc(ch, outputFile);
    }
    while (EOF != (c = fgetc(inputFile))) {
        if (isupper(c))
        {
            upper++;
        }


        else if (islower(c))
        {
            lower++;
        }
        fputc(upper, outputFile);
        fputc(lower, outputFile);
    }

    fclose(inputFile);
    fclose(outputFile);

    return 0;

}

1 个答案:

答案 0 :(得分:3)

您的主要问题是您使用2个循环来读取输入文件。 你的第二个循环应该rewind之前的文件开始重新读取文件。

您可以使用单个循环进行计数和转换。

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

#define INPUT_FILE      "input.txt"
#define OUTPUT_FILE     "output.txt"

int main()
{
    FILE *inputFile = fopen(INPUT_FILE, "rt");
    if (NULL == inputFile) {
        printf("ERROR: cannot open the file: %s\n", INPUT_FILE);
        return -1;
    }

    // 2. Open another file
    FILE *outputFile = fopen(OUTPUT_FILE, "w");
    if (NULL == outputFile) {
        printf("ERROR: cannot open the file: %s\n", OUTPUT_FILE);
        return -1;
    }

    int ch;
    int upper = 0;
    int lower = 0;
    int count = 0;

    while (EOF != (ch = fgetc(inputFile)))
    {
        if (isalpha(ch))
        {
            if (islower(ch))
            {
                ch = toupper(ch);
                upper++;

            }
            else
            {
                ch = tolower(ch);
                lower++;
            }

            count++;
        }

        fputc(ch, outputFile);
    }

    fprintf(outputFile, "\nTotal: %d\nToUpper: %d\nToLower: %d\n", count, upper, lower);

    fclose(inputFile);
    fclose(outputFile);

    return 0;
}

另请注意,在转换案例之前,您必须检查读取char是否为alpha char,因为循环内的isalpha调用会这样做。