@Telyaha

Как переписать код с C++ на С(си)?

Приветствую всех форумчан. Программирую недавно и многого не знаю(
Прошу помогите(подскажите как) переписать этот код с С++ на С?(В С не особо разбираюсь, а времени мало осталось)
Задача: подсчитать кол-во уникальных слов в тексте.
Что делает код: Считывает все слова из файла test.txt и заносит в массив startArr. После этого переносит все уникальные слова в массив res(т е остаются слова без повторений и дубликатов, в единичном числе). В конце выводится количество уникальных слов в тексте(размер массива res)
Прокомментировал, надеюсь все будет понятно
#include <iostream>
#include <vector>
#include <algorithm>
#include <list>
#include <fstream>
#include <sstream>

using namespace std;

int main()
{
    setlocale(LC_ALL, "ru");//подключаем русский

    list <string> startArr;//исходные данные
    list <string> res;//конечный лист

    //чтение файла
    string str;
    ifstream In("D:\\test.txt"); //открываем файл
    if (!In) cout << "Error"; //если не закрыли, то даем ошибку
    if (In.is_open()) {
        while (In>>str) { // пока есть слова заносим их в массив
            startArr.emplace_back(str);
        }
    }
    In.close();//закрываем

    startArr.unique();//убираем дубликаты
    for (auto it = startArr.begin(); it != startArr.end(); it++) {
        auto fr = find(res.begin(), res.end(), *it);//проверяем, есть ли уже этот элемент в новом листе
        if (fr==res.end()) 
            res.emplace_back(*it);//если нет, то добавляем
    }
    int size = res.size();//записываем размер массива res
    cout << "Уникальных слов: " << size << endl;
    for (auto it = res.begin(); it != res.end(); it++) {
        cout << (*it) << " ";//вывод для отладки
    }
}
  • Вопрос задан
  • 1036 просмотров
Пригласить эксперта
Ответы на вопрос 1
@famousman204
не уверен, что правильно понял, но всё же. Мне кажется нужно сделать список структур что то вроде этого:
// если я правильно понял, что делает list <string>
struct s_list
{
    char *str;
    struct s_list *next;
    struct s_list *back;
};

если же просто нужно сделать 2 массива(хотя суть не сильно изменится), в startArr исходные данные, а в res отсортированные, то можно сделать как то так:(сортировку не стал писать)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int		main(void)
{
	long lsize;
	char *startArr;
	size_t result;

	FILE *in_file = fopen("test.txt", "r");
	if (in_file == NULL)
	{
		printf("Error\n");
		return (1);
	}
	fseek(in_file, 0, SEEK_END);
	lsize = ftell(in_file);
	rewind(in_file);
	startArr = (char*)malloc(sizeof(char) *lsize);
	if (startArr == NULL)
	{
		printf("Error\n");
		return (2);
	}
	result = fread(startArr, 1, lsize, in_file);
	if (result != lsize)
	{
		printf("Error\n");
		return (3);
	}
	if (res == NULL)
	{
		printf("Error\n");
		return (2);
	}
	fclose(in_file);
	printf("%s\n", startArr);
	find_words(startArr);
        free(startArr);
	return (0);
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы