длина массива символов с использованием динамического c выделения - PullRequest
1 голос
/ 06 августа 2020

Вот мой код

#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 на консоли, это не та строка, которую я хочу. Кто-нибудь может сказать мне, почему, и подробнее об этом ??

Ответы [ 2 ]

2 голосов
/ 06 августа 2020

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

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

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

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

s = (char*)malloc(length + 1);
2 голосов
/ 06 августа 2020

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

...