Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2023, 23:03   #1
Alex_andr
Пользователь
 
Регистрация: 08.12.2022
Сообщений: 23
По умолчанию СИ (С)

Доброго времени суток. Очень нужна помощь с написание программы на языке си! Часть задания я сделал, но вот "последний кусочек " задачи никак не получается решить. Умоляю, помогите.
задание было таким:
Дан файл тхт
1) а.out открыть файл, если его нет сообщить об этом.
2)Найти строку (/n заканчивается) с наибольшим количеством гласных букв и вывести на экран.
3)На входе 2 строки, заменить все вхождения первой строки на вторую строку.
вот такой код я написал:
Код:
#include <stdio.h>
#include <string.h>
#include <assert.h>
#define VOWELS "AaEeIiOoUuYy"
 
size_t count_vowels(const char * s) 
{
    size_t cnt = 0;
 
    for (s = strpbrk(s, VOWELS); s; s = strpbrk(s + 1, VOWELS))
        cnt += 1;
    
    return cnt;
}
 
#define FILE_NAME "file.txt"
 
int main(void) 
{
    char str[BUFSIZ], vowelsfull[BUFSIZ];
    size_t curVovels, maxVovels;
    FILE * fin = fopen(FILE_NAME, "r");
    assert(fin);
 
    if (!fgets(vowelsfull, BUFSIZ, fin)) 
    {
        fprintf(stderr, "Input file is empty or read error!\n");
        return (1 | fclose(fin));
    }
    maxVovels = count_vowels(vowelsfull);
    printf("%s", vowelsfull);
 
    while (fgets(str, BUFSIZ, fin)) 
    {
        printf("%s", str);
        curVovels = count_vowels(str);
        if (curVovels > maxVovels) {
            maxVovels = curVovels;
            strcpy(vowelsfull, str);
        }
    }
    if (ferror(fin) | fclose(fin))
        fprintf(stderr, "Something wrong with input file!\n");
    
    printf("\n\nMost vowels full string (contains %zu vowels):\n%s", maxVovels, vowelsfull);
 
    return 0;
}
Не получается сделать 3 пункт.
Буду очень благодарен за помощь!
Alex_andr вне форума Ответить с цитированием
Старый 11.02.2023, 23:02   #2
Пётр Седов
Форумчанин
 
Регистрация: 26.10.2022
Сообщений: 119
По умолчанию

Цитата:
Сообщение от Alex_andr Посмотреть сообщение
3)На входе 2 строки, заменить все вхождения первой строки на вторую строку.
...
Не получается сделать 3 пункт.
Если читать строки функцией fgets (чего во «взрослых» программах делать не надо), то можно так:
Код:
#include <stdio.h>
#include <string.h>

#define INPUT_FILE_NAME "input.txt"
#define OUTPUT_FILE_NAME "output.txt"
#define MAX_LINE_LEN 100
#define OLD_TEXT "small"
#define NEW_TEXT "big"

int main() {
  FILE* input_file;
  FILE* output_file;
  char line[MAX_LINE_LEN + 1];
  char* p1;
  char* p2;

  input_file = fopen(INPUT_FILE_NAME, "rt");
  if (input_file == NULL) {
    printf("Cannot open file \"%s\".\n", INPUT_FILE_NAME);
    return 1;
  }
  output_file = fopen(OUTPUT_FILE_NAME, "wt");
  if (output_file == NULL) {
    printf("Cannot create file \"%s\".\n", OUTPUT_FILE_NAME);
    fclose(input_file);
    return 1;
  }

  while (fgets(line, sizeof(line), input_file) != NULL) {
    /* заменяем OLD_TEXT → NEW_TEXT */
    p1 = line;
    for (;;) {
      p2 = strstr(p1, OLD_TEXT);
      if (p2 == NULL) {break;}
      fwrite(p1, 1, p2 - p1, output_file);
      fputs(NEW_TEXT, output_file);
      p1 = p2 + strlen(OLD_TEXT); /* современные компиляторы оптимизируют strlen(<строковый литерал>) в константу */
    }
    fputs(p1, output_file);
  }
  fclose(input_file);
  fclose(output_file);
  return 0;
}
Цитата:
Сообщение от Alex_andr Посмотреть сообщение
Код:
    FILE * fin = fopen(FILE_NAME, "r");
    assert(fin);
assert-ом надо проверять ошибки самого программиста, например неправильный индекс массива, или неправильное значение параметра функции (отрицательная площадь). То есть assert -- он для отлова bug-ов, и его кстати можно отключить макросом NDEBUG. А ситуации вроде «нужный для работы файл отсутствует» или «пользователь ввёл буквы вместо числа» -- это не bug-и, и их уже надо по-другому обрабатывать. И проверки таких ситуаций отключать нельзя.
Пётр Седов вне форума Ответить с цитированием
Старый 12.02.2023, 02:02   #3
Alex_andr
Пользователь
 
Регистрация: 08.12.2022
Сообщений: 23
По умолчанию

Пётр Седов, Спасибо большое, очень выручили!
Alex_andr вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск