• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

Перевести код из C++ на C. Подскажите что нужно изменить и как? Желательно подробно.

M

magic_ananasik

C++:
#include "pch.h"
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
char** arrStr;                            //массив строк текста
int countStr;                      //кол-во строк
char* separators;                  //массив разделителей
int countSep;                      //кол-во разделителей   
char** result;                            //Результат работы
int countRes;                      //Кол-во результирующих строк
int countWord;                            //Кол-во слов в строке
void ReadAllStr();
void ReadAllSep();
void ReadStr(char* str);
void ReadSep(char sep);
bool CheckSep(char symbol);
bool CheckStop(char* str);
bool CheckSame(char sep);
bool GoodStr(char* str);
void PrintAllStr();
void PrintAllSep();
void PrintResult();
int GetCountWord(char* str);
char* ProcStr(char* str);
char** Split(char* str);
int FindMinSep(char** words);
int GetCountSep(char* words);
int main()
{
       setlocale(LC_CTYPE, "rus"); // вызов функции настройки локали
       countSep = 0;
       countStr = 0;
       printf("Ввод строк. Вводить на англ. Если строка будет повторяться, ввод строк прекратиться\n");
       printf("Внимательно следите за пробелами. Каждый пробел обозначает разделение слова.\n");
       printf("Не вводить несколько пробелов подрят и перед концом строки\n");
       ReadAllStr();
       PrintAllStr();
       printf("Ввод разделителей\n");
       //вводим разделители
       ReadAllSep();
       PrintAllSep();
       countRes = 0;
       for (int i = 0; i < countStr; i++)
       {
              //Если в строке нечетное кол-во слов, отправляем на обработку
              if (GoodStr(arrStr))
              {
                     char* newStr = ProcStr(arrStr);
                     countRes++;
                     result = (char**)realloc(result, countRes * sizeof(char*));
                     int k = strlen(newStr);
                     result[countRes - 1] = (char*)malloc(k + 1);
                     for (int j = 0; j < k; j++)
                     {
                            result[countRes - 1][j] = newStr[j];
                     }
                     result[countRes - 1][k] = '\0';
              }
       }
       PrintResult();
       for (int i = 0; i < countStr; i++)
       {
              free(arrStr);
       }
       for (int i = 0; i < countRes; i++)
       {
              free(result);
       }
       free(arrStr);
       free(separators);
       free(result);
       bool f;
}
void ReadAllStr()
{
       bool stop = false;
       do
       {
              char str[80];
              printf("Введите строку не превышающую 80 символов:\n");
              gets_s(str);
              if (CheckStop(str))
                     stop = true;
              else
                     ReadStr(str);
       } while (!stop);
}
void ReadStr(char* str)
{
       //найдем размер строки
       int k = 0;
       for (int i = 0; i < strlen(str) && str != '\0'; i++)
       {
              k++;
       }
       //выделим память
       countStr++;
       arrStr = (char**)realloc(arrStr, countStr * sizeof(char*));
       arrStr[countStr - 1] = (char*)malloc(k + 1);
       //перезапишем в наш массив
       for (int i = 0; i < k; i++)
       {
              arrStr[countStr - 1] = str;
       }
       arrStr[countStr - 1][k] = '\0';
}
bool CheckStop(char* str)
{
       //проверка на существование похожей строки
       for (int i = 0; i < countStr; i++)
       {
              //если строки идентичны
              if (strcmp(arrStr, str) == 0) return true;
       }
       return false;
}
void ReadAllSep()
{
       bool stop = false;
       char sep;
       //scanf("%c", &sep);;
       do
       {
              printf("Введите разделитель (Считывает только 1 символ из введеной строки): \n");
              //чтение 1 символа
              scanf("%c", &sep);
              //Все остальное в этой строке выкидываем
              for (char c = getchar(); c != '\n' && c != EOF; c = getchar());
              //проверка разделителя
              if (CheckSame(sep)) printf("Такой разделитель уже существует: %c \n", sep);
              else
              {
                     ReadSep(sep);
                     printf("Получен разделитель : %c \n", separators[countSep - 1]);
              }
              printf("Хотите ввести еще 1? (1 - да, 0 - нет) ");
              sep = getchar();
              if (sep != '1') stop = true;
              //Все остальное в этой строке выкидываем, если ввели больше 1 символа
              for (char c = getchar(); c != '\n' && c != EOF; c = getchar());
       } while (!stop);
}
bool CheckSame(char sep)
{
       //проверка на существование похожего разделителя
       for (int i = 0; i < countSep; i++)
       {
              //если строки идентичны
              if (separators == sep) return true;
       }
       return false;
}
void ReadSep(char sep)
{
       //выделим еще память
       countSep++;
       separators = (char*)realloc(separators, countSep * sizeof(char));
       separators[countSep - 1] = sep;
}
void PrintAllStr()
{
       printf("Введенный текст:\n");
       for (int i = 0; i < countStr; i++)
       {
              printf("%s\n", arrStr);
       }
       printf("\n");
}
void PrintAllSep()
{
       printf("Получены разделители:\n");
       for (int i = 0; i < countSep; i++)
       {
              printf("%c \n", separators);
       }
       printf("\n");
}
bool GoodStr(char* str)
{
       if (GetCountWord(str) % 2 == 0) return false;
       return true;
}
int GetCountWord(char* str)
{
       countWord = 0;
       for (int i = 0; i < strlen(str) && str != '\0'; i++)
       {
              if (str == ' ') countWord++;
       }
       if (strlen(str) != 0) countWord++;
       return countWord;
}
char* ProcStr(char* str)
{
       char* newStr = NULL;
       int k = 0;
       char** words = Split(str);
       int min = FindMinSep(words);
       for (int i = 0; i < countWord; i++)
       {
              if (GetCountSep(words) != min)
              {
                     for (int j = 0; words[j] != '\0'; j++)
                     {
                            newStr = (char*)realloc(newStr, (k + 1) * sizeof(char));
                            newStr[k] = words[j];
                            k++;
                     }
                     newStr = (char*)realloc(newStr, (k + 1) * sizeof(char));
                     newStr[k] = ' ';
                     k++;
              }
       }
       newStr = (char*)realloc(newStr, (k + 1) * sizeof(char));
       newStr[k] = '\0';
       k++;
       //free(words);
       //words = NULL;
       for (int i = 0; i < countWord; i++)
       {
              free(words);
       }
       countWord = 0;
       return newStr;
}
char** Split(char* str)
{
       char** arrWords = (char**)malloc(countWord * sizeof(char*));
       int cur = 0;
       char* buffer = NULL;
       int countBuff = 0;
       for (int i = 0; i < strlen(str) && str != '\0'; i++)
       {
              if (str != ' ')
              {
                     countBuff++;
                     buffer = (char*)realloc(buffer, countBuff * sizeof(char));
                     buffer[countBuff - 1] = str;
              }
              else
              {
                     countBuff++;
                     buffer = (char*)realloc(buffer, countBuff * sizeof(char));
                     buffer[countBuff - 1] = '\0';
                     arrWords[cur] = (char*)malloc(countBuff);
                     for (int j = 0; j < countBuff; j++)
                     {
                            arrWords[cur][j] = buffer[j];
                     }
                     cur++;
                     free(buffer);
                     buffer = NULL;
                     countBuff = 0;
              }
       }
       if (buffer != NULL)
       {
              countBuff++;
              buffer = (char*)realloc(buffer, countBuff * sizeof(char));
              buffer[countBuff - 1] = '\0';
              arrWords[cur] = (char*)malloc(countBuff);
              for (int j = 0; j < countBuff; j++)
              {
                     arrWords[cur][j] = buffer[j];
              }
              cur++;
       }
       free(buffer);
       return arrWords;
}
int FindMinSep(char** words)
{
       int min = 1000;
       for (int i = 0; i < countWord; i++)
       {
              int newMin = GetCountSep(words);
              if (newMin < min && newMin != 0) min = newMin;
       }
       return min;
}
int GetCountSep(char* words)
{
       int k = 0;
       for (int i = 0; i < strlen(words); i++)
       {
              if (CheckSep(words)) k++;
       }
       return k;
}
bool CheckSep(char symbol)
{
       for (int i = 0; i < countSep; i++)
       {
              if (separators == symbol) return true;
       }
       return false;
}
void PrintResult()
{
       printf("Результат:\n");
       printf("********\n");
       for (int i = 0; i < countRes; i++)
       {
              printf("%s\n", result);
       }
       printf("********\n");
       printf("\n");
}
 
Заменить
C++:
#include <iostream>
using namespace std;
на
C:
#include <stdio.h>
Беглым взглядом ничего плюсового больше не обнаружил.
P.S. В качестве удочки поясню, что нужно делать. Нужно искать атрибутику ООП (классы, шаблоны, исключения (в частности, операторы new/delete), виртуальные функции, перегрузки и т.д.) ну и подключаемые плюсовые заголовки.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!