Как я могу скопировать несколько строк char * в одну с помощью strcpy_s ()? - PullRequest
2 голосов
/ 05 мая 2020

Используя функцию strcpy_s(), я хочу сопоставить первые три строки в последнюю, чтобы напечатать мое полное имя. Это то, что у меня есть, и это не работает, поскольку я использую char* строки, а не std::string s.

#include <iostream>
using namespace std;

int main()
{
    char str_first[] = "Nerf_";
    char str_middle[] = " Herder";
    char str_last[] = "42";

    char str_fullName[35];

    strcpy_s(str_fullName, (str_first + str_middle + str_last).c_str());
    cout << str_fullName;
}

Есть предложения?

Ответы [ 3 ]

2 голосов
/ 05 мая 2020

Это должно быть близко к тому, что вы ищете, строго используя strcpy_s для объединения строк:

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

int main()
{
    char str_first[] = "Nerf_";
    char str_middle[] = " Herder";
    char str_last[] = "42";

    char str_fullName[35];

    int index = strcpy_s(str_fullName, sizeof str_fullName, str_first);
    index += strcpy_s(str_fullName + index, sizeof str_fullName - index, str_middle);
    index += strcpy_s(str_fullName + index, sizeof str_fullName - index, str_last);
    cout << str_fullName;
}

Переменная index служит нескольким целям : (1) для предоставления нового индекса в выходной строке str_fullName при построении строки и (2) вычитание из sizeof str_fullName, он «регулирует» доступный размер буфера при построении строки.

Предостережения в том, что вы должны добавить проверку переполнения через вывод из strcpy_s, и (как отметили другие) есть лучшие шаблоны для этого, но, вероятно, в качестве академического c упражнения здесь есть чему поучиться.

1 голос
/ 05 мая 2020

Вам необходимо использовать как strcat, так и strcpy

См. Дополнительные сведения в комментариях к коду.

// disable SDL warnings in Visual studio
#define _CRT_SECURE_NO_WARNINGS

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

int main()
{
    // TODO: insert checking code,
    // to make sure destination can hold all characters + one termination.

    char str_first[] = "Nerf_";
    char str_middle[] = " Herder";
    char str_last[] = "42";

    char str_fullName[35];

    // copy first string because we need null terminated destination
    strcpy(str_fullName, str_first);

    // append the rest, string is auto null terminated.
    strcat(str_fullName, str_middle);
    strcat(str_fullName, str_last);

    cout << str_fullName;
}
0 голосов
/ 05 мая 2020

Если я не ошибаюсь, функция strcpy_s ожидает трех аргументов. Поэтому либо укажите еще один аргумент для вызова функции, либо используйте вместо него функцию strcpy.

И нет необходимости использовать стандартный класс std :: string для выполнения задачи.

Код может выглядеть следующим образом:

strcpy( str_fullName, str_first );
strcat( str_fullName, str_middle );
strcat( str_fullName, str_last );

Или вы можете использовать strcpy_s и strcat_s при условии, что вы укажете правильное количество аргументов.

Обратите внимание на то, что вам нужно включить заголовок

#include <cstring>
...