Вставить заданное слово после слова, кол-во букв которого четное

349
27 декабря 2016, 00:32

Как вставить заданное слово? Конкретно интересует функция InputWord. Если я правильно понимаю, то я сначала должен увеличить память на кол-во символов заданного слова. Затем сдвигать элементы строки "вправо" на strlen(keyword) с определенной позиции(после слова, с четным кол-вом символов). Поправьте, если не прав.

#include <iostream>
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
//Проверка на символ разделитель
bool IsSep(char* sep, char litera)
{
    for (int i = 0; * (sep + i) != '\0'; i++)
    {
        if (*(sep + i) == litera) return true;
    }
    return false;
}
// Подсчитывает кол-во слов
int WordCounter(char* sep, char* line)
{
    int wordcounter = 0;
    bool flag = 0;
    for (int i = 0; * (line + i) != '\0'; i++)
    {
        if (!IsSep(sep, *(line + i)))
        {
            flag = 1;
        }
        else if (flag == 1)
        {
            wordcounter++;
            flag = 0;
        }
    }
    if (flag == 1) wordcounter++;
    return wordcounter;
}
// Ввод строки
char* GetLine()
{
    char* text = NULL;
    char ch;
    for (int counter = 1 ;; counter++)
    {
        ch = getchar();
        text = (char*)realloc(text, counter * sizeof(char));
        if (ch != '\n')
        {
            *(text + counter - 1) = ch;
        }
        else
        {
            *(text + counter - 1) = '\0';
            break;
        }
    }
    return text;
}
char* InputWord(char* line, int pos, char* keyword) //char keyword??
{
    line = (char*)realloc(line,
                          (strlen(line) + 1 + strlen(keyword)) * sizeof(char));
    //strcpy(line+pos+strlen(keyword),line+pos);
    for (int i = 0; i < strlen(keyword); i++)
    {
        char t;
        for (int k = pos; k != strlen(keyword) + strlen(line); k++)
        {
            t = line[k];
            line[k] = line[k + 1];
            line[k + 1] = t;
        }
        return line;
    }
    for (int g = 0; g < strlen(keyword); g++)
    {
        line[pos + g] = keyword[g];
    }
    puts("test:");
    puts(line);
}
int main()
{
    setlocale(LC_ALL, "");
    setvbuf(stdout, NULL, _IONBF, 0);
    char* sep = NULL;
    puts("Введите строку символов разделителей:");
    sep = GetLine();
    char** lines = NULL;
    int minwords = -1;
    int amountofstrings;
    puts("Вводите строки текста:");
    for (amountofstrings = 1;; amountofstrings++)
    {
        //Ввод строки
        lines = (char**)realloc(lines, amountofstrings * sizeof(char*));
        lines[amountofstrings - 1] = GetLine();
        if ((WordCounter(sep, lines[amountofstrings - 1]) > 0))
        {
            if ((WordCounter(sep, lines[amountofstrings - 1]) == minwords))
                break;
            if ((WordCounter(sep, lines[amountofstrings - 1]) < minwords) ||
                    (minwords < 0))
                minwords = WordCounter(sep, lines[amountofstrings - 1]);
        }
    }
    printf("Минимальное кол-во слов: %d\n", minwords); // Для себя
    printf("Кол-во строк: %d\n", amountofstrings);
    // Ввод слова, который нужно будет вставить в текст
    char* keyword = NULL;
    puts("\nВведите слово:");
    keyword = GetLine();
    printf("Длина кодового слова: %d\n", strlen(keyword));
    int wordlen = 0;
    for (int i = 0; i < amountofstrings; i++)
    {
        wordlen = 0;
        for (int k = strlen(lines[i]) - 1; k != -1; k--)
        {
            if (!IsSep(sep, lines[i][k]))
            {
                wordlen++;
                if ((k == 0) && (wordlen % 2 == 0))
                {
                    printf("Четное слово.  %d  %d .\n", k, k + wordlen);
                    lines[i] = InputWord(lines[i], k + wordlen, keyword);
                }
            }
            else if ((wordlen != 0) && (wordlen % 2 == 0))
            {
                printf("Четное слово.  %d  %d .\n", k, k + wordlen + 1);
                lines[i] = InputWord(lines[i], k + wordlen + 1, keyword);
                wordlen = 0;
            }
            else
            {
                wordlen = 0;
            }
        }
    }
    //Пример из 11 в 13
    puts("**************************");
    // Вывод строк
    for (int i = 0; i < amountofstrings; i++)
    {
        puts(lines[i]);
    }
    return 0;
}
Answer 1
char* InputWord(char* line, int pos, char* keyword)
{
    // Можно сохранить strlen(keyword) и брать из переменной
    line = (char*)realloc(line,(strlen(line)+1+strlen(keyword))*sizeof(char));
    memmove(line+pos+strlen(keyword), line+pos, strlen(line+pos)+1);
    memcpy(line+pos,keyword,strlen(keyword));
    return line;
}
int main(int argc, const char * argv[])
{
    char * line = (char*)malloc(80);
    strcpy(line, "12345678");
    line = InputWord(line,4," + ");
    puts(line);
}

Только мороки с вашим подходом...
Это не C++, это просто C.
Передавать в функцию можно только динамическую память.
По возвращении надо обязательно сохранять новый указатель.

Answer 2

Мне кажется, что лучше использовать string::insert.

READ ALSO
Падает коннект к БД

Падает коннект к БД

Делаю проект на heroku (бесплатный аккаунт)Использую Sping + Hibernate + MySQL

323
SQL скорость выборки [требует правки]

SQL скорость выборки [требует правки]

Что будет выполняться быстрее?

321
UPDATE + сложение

UPDATE + сложение

Подскажите как сделать апдейт что бы значение в ячейке не перезатиралось, а добавлялось (если возможно без предварительной выборки сложения...

443
Не добавляются данные в таблицу БД. (PyMySQL)

Не добавляются данные в таблицу БД. (PyMySQL)

Делал все через Python 35 в связке с PyMySQL

461