Как преобразовать мою строку в массив символов - PullRequest
0 голосов
/ 15 апреля 2020

Вот проблема. Когда я пытаюсь преобразовать его с помощью strncpy_s, массив имеет в конце какой-то тип «tra sh data» из памяти. Даже когда я заполняю буфер "\ 0". Как конвертировать это ясно?

typedef class Ryadok {
private:
    int LengthOf = 0;
    char text[20];
    string* address;
public:
    Ryadok(string strin) {
        this->text[0] = '\0';
        memset(text, '\0', sizeof(text));
        strncpy_s(text, strin.c_str(), sizeof(text) - 1);
        this->address = &strin;
        for (int i = 0; i < sizeof(strin); i++) {
            cout << this->text[i];
        }
    }
    ~Ryadok() {
    }
}*cPtr;
int main()
{
    Ryadok example("sdsdfsdf");
}

Ответы [ 3 ]

0 голосов
/ 15 апреля 2020

При использовании функции strncpy_s вы указываете ей копировать столько символов, сколько уместится в ваш буфер "text". Поскольку строка, в которой вы создаете экземпляр "example", короче, функция копирования будет продолжать идти после конца фактической строки.

Вот откуда ваш мусор. Еще хуже, вы рискуете Сегментация Ошибка таким образом. Ваш код может получить доступ к частям оперативной памяти, из которой ему запрещено читать. Это приведет к взлому sh.

Вы правы, хотя скопировали данные, на которые указывает возврат c_str(). Указатель, возвращаемый c_str(), указывает на данные, которые принадлежат объекту std :: string и могут быть изменены или даже аннулированы этим объектом. (Подробнее здесь)

Вот модифицированная версия вашего кода, которая должна избегать мусора:

typedef class Ryadok {
    private:
        int LengthOf = 0;
        char text[20];
        string* address;
    public:
        Ryadok(string strin) {
            this->text[0] = '\0';
            memset(text, '\0', sizeof(text));

            if(strin.length()+1 <= sizeof(text)) {
                strncpy_s(text, strin.c_str(), strin.length()+1);
            } else {
                //some error handling needed since our buffer is too small
            }

            this->address = &strin;
            for (int i = 0; i < sizeof(strin); i++) {
                cout << this->text[i];
            }
        }
    ~Ryadok() {
    }
}*cPtr;

int main()
{
    Ryadok example("sdsdfsdf");
}
0 голосов
/ 15 апреля 2020

Идея использовать функцию c_str () для преобразования std :: string в a-строку. Затем мы можем просто вызвать функцию strcpy (), чтобы скопировать строку c в массив char

std::string s = "Hello World!";
char cstr[s.size() + 1];
strcpy(cstr, s.c_str());    // or pass &s[0]
std::cout << cstr << '\n';
return 0;
0 голосов
/ 15 апреля 2020

A std::string может быть преобразовано в char* через c_str() ссылку :

std::string str = "hello";
const char *strC = str.c_str();

Однако, похоже, что ваша цель состоит в том, чтобы перебрать стандарт :: строка, так что весь конструктор может быть упрощен:

std::string strin="sdsdfsdf";

for(auto const& c : strin) {
    std::cout << c << std::endl;
}
...