Как вставить заданное слово? Конкретно интересует функция 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;
}
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.
Передавать в функцию можно только динамическую память.
По возвращении надо обязательно сохранять новый указатель.
Мне кажется, что лучше использовать string::insert
.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Делаю проект на heroku (бесплатный аккаунт)Использую Sping + Hibernate + MySQL
Подскажите как сделать апдейт что бы значение в ячейке не перезатиралось, а добавлялось (если возможно без предварительной выборки сложения...