Преобразование и подсчет символов верхнего и нижнего регистра

#c

#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: %sn", INPUT_FILE);
        return -1;
    }

    // 2. Open another file
    FILE *outputFile = fopen(OUTPUT_FILE, "wt");
    if (NULL == inputFile) {
        printf("ERROR: cannot open the file: %sn", 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. Условные обозначения Yoda не нужны, компиляторы улучшены. Не говоря уже о том, что вы if все равно неправильно поняли второе утверждение, доказывая, что условные обозначения Yoda не соответствуют человеческой способности к ошибкам.

2. Второй if (NULL == inputFile) -> if (NULL == outputFile)

3. Я получаю вывод hELLO wORLD в выходном файле, но не количество.

4. Первый while цикл считывает весь файл. Поэтому второй while цикл считывается EOF и никогда не выполняется. Решение состоит в том, чтобы подсчитать буквы верхнего и нижнего регистра в первом while цикле и удалить второй while цикл.

5. Вы никогда не входите во второй цикл. Почему бы не преобразовать и не посчитать в том же цикле?

Ответ №1:

Ваша основная проблема заключается в том, что вы используете 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: %sn", INPUT_FILE);
        return -1;
    }

    // 2. Open another file
    FILE *outputFile = fopen(OUTPUT_FILE, "w");
    if (NULL == outputFile) {
        printf("ERROR: cannot open the file: %sn", 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: %dnToUpper: %dnToLower: %dn", count, upper, lower);

    fclose(inputFile);
    fclose(outputFile);

    return 0;
}
  

Также обратите внимание, что вы должны проверить, является ли прочитанный символ буквенным символом, прежде чем преобразовывать регистр, как isalpha это делает вызов внутри цикла.