Вот мой код

#include<iostream>
#include<string>
using namespace std;
char* getString(char*& s)
{
    string str;
    getline(cin, str);
    int length = str.length();
    s = (char*)malloc(length);
    for (int i = 0; i < length; ++i)
        s[i] = str[i];
    return s;
}

void main()
{
    char* s;
    getString(s);
    cout << s << endl;
}

В моей функции getString() я создаю строку str и передаю ей входную строку. Затем я вычисляю длину str и затем выделяю это количество байтов для массива символов s. Но проблема в том, что когда я вызываю strlen(s), возвращаемое значение не равно длине строки str, поэтому, когда я печатаю s на консоли, это не строка я хочу. Кто-нибудь может сказать мне, почему, и объяснить об этом больше ??

1
babylearnmaths 6 Авг 2020 в 05:26

2 ответа

Лучший ответ

Когда у вас есть массив символов, самый последний байт называется нулевым ограничителем , которым в данном случае является \0. Это то, что сообщает вашей программе, где находится конец символов в массиве.

Функция str.length() возвращает количество байтов в строке. Нулевой символ не считается байтом. Поэтому, когда str.length() подсчитывает, сколько символов в вашем массиве, он считается, пока не достигнет \0.

Когда вам нужно создать новый массив того же «размера», что и строка, вы должны сделать его на один байт длиннее, чтобы учесть нулевой терминатор.

Итак, ваш код должен быть:

s = (char*)malloc(length + 1);
2
Ovcheric 6 Авг 2020 в 02:43

Вам нужно выделить на один символ больше, чем str.length() для разрешить нулевой символ, который завершает строку, и вам необходимо установить этот символ в нулевой символ.

2
bitmask 6 Авг 2020 в 02:37
63275992