Работа со строками в Си, вставить "hello" после первого слова

Добавление слова “hello” после первого слова введенной строки.Прошу подсобить с кодом.Вот мой набросок.

#include <iostream>
#include <string> 
using namespace std;

int main()
{
    setlocale(LC_ALL, "Rus");
    char s[100];
    char s1[] = "hello";
    cout << "Введите строку:";
    gets_s(s);
    //strcpy_s(s1, s);
    //strcat_s(s, s1);
    for (int i = 0; i <= strlen(s); i++)
        if (s[i] == ' ') 
            strcat_s(s, s1);
    puts(s);
    system("pause");
}

Если strcat_s, то еще размер передать вторым параметром (чтобы не было переполнения буфера если строка длиннее).
Например, как тут внизу: https://en.cppreference.com/w/c/string/byte/strcat

1 лайк

Нету какого-то inserta в С?
http://www.cplusplus.com/reference/string/string/insert/

Да, надо-то С или С++?

Чот тут cout от С++, а строки из С )
Если можно С++, то проще std::string как выше.
Если С, то надо самому создать новую строку соединив то, что до, “hello”, и то, что после.

с++, но мне нужно именно поработать с char, но у меня не получается поместить слово именно после первого слова строки

А после какого слова получается?

Допустим, я ввожу произвольную строку (Hey man) и после первого слова этой строки мне нужно поместить слово “hello”.Должно получиться(Hey hello man).

:arrow_up:

strncpy + strcat

1 лайк

А вот каким именно образом это реализовать у меня не хватает ума

В новую пустую (с нулями) строку

  • strncpy до индекса конца слова
  • strcat hello
  • strcpy после индекса

В последнем надо передавать что-то типа s + i, чтоб начинать копировать после символа с номером i.

https://www.codingame.com/playgrounds/14213/how-to-play-with-strings-in-c/string-copy

2 лайка

Классный сайт. Я, который не различает С от С++, пролистав несколько страниц, собрал из предоставленных примеров следующее.

#include <stdio.h>
#include <string.h>
#define DEST_SIZE 40

int main()
{
	char str[] = "strtok needs to be called several times to split a string";
	//int init_size = strlen(str);
	char delim[] = " ";
    char insert_word[] = "rocks";
    char dest[DEST_SIZE] = "";
	char *ptr = strtok(str, delim);
    int i = 0;

	while(ptr != NULL)
	{
		strcat(strcat(dest, ptr)," ");
        if(i == 0)
        {
            strcat(strcat(dest, insert_word)," ");
            i++;
        }
		ptr = strtok(NULL, delim);
	}

    printf(dest);
    
	printf("\n");

	return 0;
}
1 лайк

Ничего путного, как всегда, не получилось.

#include <iostream>
#include <string> 
using namespace std;
int main()
{
    setlocale(LC_ALL, "Rus");
    char s[100], str[100], str1[100];
    char s1[] = "hello";
    cout << "Введите строку:";
    gets_s(s);
    strcpy_s(str, s);
    for (int i = 0; i <= strlen(str); i++)
        if (str[i] == ' ')
            str[i] = '\0';
    //puts(str);
    strcat_s(str, s1); // добавили вставляемое слово
    strcat_s(str, s); // нужно добавить остаток строки
    strcpy_s(s, str);
    puts(s);
    system("pause");
}

я ж говорю


Тут что-то очень странное.
Надо найти первый пробел (еще, кстати, вероятно надо не забыть хотя бы про возможность строки с одним словом без пробелов), сделать что надо, и выйти из цикла (break, …)

1 лайк

Сделайте конкатенацию строк без циклов.

P. S.
Дополнительная инфо.: Работа со строками в C++. Часть 1: Основы

я и пытаюсь, но никак не получается

#include <iostream>
#include <string> 
using namespace std;

int main()
{
    setlocale(LC_ALL, "Rus");
    char s[100], str[100], str1[100];
    char s1[] = " hello ";
    cout << "Введите строку:";
    gets_s(s);
    strcpy_s(str, s);
    strcpy_s(str1, s);
    for (int i = 0; i <= strlen(str); i++)
        if (str[i] == ' ')
        {
            str[i] = '\0';
            //strcpy_s(str,str1);
            break;
        }
    //puts(str);
    //puts(str1);
    //strcpy_s(str1, str);
    int L = str - str1;
    strncat_s(str, s1, 7); // добавили вставляемое слово
    strcat_s(str, s+L); // нужно добавить остаток строки
    strcpy_s(s, str);
    puts(s);
    system("pause");
}

Цикл уберите и сложите введенную строку с заготовкой.

Так мне нужно добавить заготовку после первого слова, а после этой операции добавить остаток строки, а цикл нужен, чтобы отделить первое слово от остальной части

Так и зачем вы обрезаете строку после первого слова?

Делайте так:

1 лайк

Точнее чтобы не запутаться и упростить отладку, проще скопировать эти две части в отдельные строки и потом в строку результата

        char result[100] = { 0 };

        char before[100] = { 0 };
        char after[100] = { 0 };
        
       ... 
        
        strcat_s(result, before);
        strcat_s(result, "hello");
        strcat_s(result, after);

О, оказывается в С++ (мб только в VS?) там теперь есть перегрузка, которая сама определяет размер если просто передать статический массив. Но если передавать просто указатель, result + 10 и т.п., то все еще надо самому указывать макс. размер.

Вот как-то так получилось, без циклов:
#cpp

#include <iostream>
#include <cstring>
#include <cstdlib>
 
int main(int argc, char* argv[])
{    
	std::string str = "Pupkov, Hello! !!! !!!";
	std::cout << str << std::endl;
         size_t pos = str.find_first_of(' '); // указываем символ позицию
         str.insert(pos + 1, "a good programmer on the C++!!! ");
	std::cout << str << std::endl;
	std::cout << "Bye Bye" << std::endl;
  system("pause");
  return 0;
}