Изменение значения массива char при вызове strcpy для другого массива char - PullRequest
2 голосов
/ 23 января 2020

При экспериментировании способов копирования строк в массив стиля C из-за некоторых странных ограничений я наткнулся на это странное поведение, во-первых, попытка скопировать строку с std::string::copy(), кажется, работает нормально, пока я не пытаюсь скопировать та же строка из другой переменной в другой пустой массив в стиле C с std::strcpy(), затем содержимое из первого массива получает некоторое оставшееся содержимое из строки.

#include <iostream>
#include <string>
#include <algorithm>
#include "string.h"

int main()
{
    std::string str = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut l";
    std::string str2 = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut l";

    char cstr[64] = {0};
    char cstr2[64] = {0};

    str.copy(cstr, std::min(str.size(), sizeof(cstr) / sizeof(cstr[0]) - 1));

    // cstr:  "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed di"
    std::cout << "cstr:  \"" << cstr << "\"" << std::endl;

    strcpy(cstr2, str2.c_str());
    cstr2[sizeof(cstr2) / sizeof(cstr2[0]) - 1] = '\0';

    // cstr:  "m nonumy eirmod tempor invidunt ut l"
    std::cout << "cstr:  \"" << cstr << "\"" << std::endl;

    // cstr2: "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed di"
    std::cout << "cstr2: \"" << cstr2 << "\"" << std::endl;    
    return 0;
}

Конечно, я просто пропускаю некоторые Глупый тупик тут.

Ответы [ 2 ]

1 голос
/ 23 января 2020

В первом случае

str.copy(cstr, std::min(str.size(), sizeof(cstr) / sizeof(cstr[0]) - 1));

количество копируемых символов ограничено значением sizeof( cstr ) - 1.

Таким образом, массив cstr содержит строку, потому что она была нулевой -initialized.

Во втором случае вы не ограничивали количество копируемых символов.

strcpy(cstr2, str2.c_str());

Таким образом, память вне массива cstr2 была перезаписана, поскольку строка, на которую указывает str2.c_str() содержит больше символов, чем размер массива cstr2.

Вместо этого вы можете написать

strncpy( cstr2, str2.c_str(), sizeof( cstr2 ) - 1 );

, используя функцию strncpy.

0 голосов
/ 23 января 2020

strcpy(cstr2, str2.c_str()); - это неопределенное поведение , так как при попытке скопировать более 64 байтов.

Остальная часть кода не имеет значения.

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut l
1234567890123456789012345678901234567890123456789012345678901234
...