#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
это делает вызов внутри цикла.