Почему мой копир char * возвращает разные вещи? - PullRequest
1 голос
/ 18 января 2020

Написание простого строкового копира и проверка его в функции main (). Странно то, что иногда программа возвращает

"HelloHello"

, как и должно быть, но, возможно, каждый третий раз, когда я запускаю ее, программа выводит:

"Привет! Здравствуйте! ▌▌▌▌▌▌▌▌▌▌▒ "UòB╚"

Почему хвост данных мусора только иногда добавляется в конец моей второй строки?

#include <iostream>
using namespace std;

int strlength(const char* c)
{
    int size = 0;
    while (*c) {
        ++c;
        ++size;
    }
    return size;
}

char* mystrdup(const char* c)
{
    int size = strlength(c);
    char* result = new char;
    copy(c, c + size, result);
    return result;      
}

void print_array(const char* c)
{
    int size = strlength(c);
    while (*c) {
        cout << *c;
        ++c;
    }
}

int main()
{
    char test[] = "Hello!";
    char* res = mystrdup(test);
    print_array(test);
    print_array(res);
}

Ответы [ 3 ]

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

Программа имеет неопределенное поведение, поскольку вы выделяете недостаточно памяти для строки результата.

char* mystrdup(const char* c)
{
    int size = strlength(c);
    char* result = new char;
    ^^^^^^^^^^^^^^^^^^^^^^^           
    copy(c, c + size, result);
    return result;      
}

Более того, вы не копируете конечный ноль в строку результата.

По крайней мере две функции strlength и mystrdup могут выглядеть следующим образом

size_t strlength( const char *s )
{
    size_t size = 0;

    while ( s[size] ) ++size;

    return size;
}

char * mystrdup( const char *s )
{
    size_t size = strlength( s ) + 1;

    char *result = new char[size];

    copy( s, s + size, result );

    return result;      
}

Конечно, вместо стандартного алгоритма std::copy вы можете использовать стандартную C функцию strcpy, объявленную в заголовке <cstring>.

strcpy( result, s );

И не забудьте удалить выделенный массив.

char* res = mystrdup(test);
//…
delete [] res;

Обратите внимание, что функция print_array не использует переменную size. Нет необходимости выводить C -строку за символом.

Функция может быть определена как

std::ostream & print_array( const char *s, std::ostream &os = std::cout )
{
    return os << s;
}

И, наконец, идентификатор c обычно используется с одиночным объекты типа char. Если вы имеете дело со строкой, то лучше использовать идентификатор s.

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

В вашем коде несколько ошибок. Вы выделяете неправильную память (char вместо char char). Вы не удаляете память. Прекратите использовать C -string и используйте std :: string

#include <iostream>
#include <string>
using std::cout;

void print_array(const char* c)
{
    while (*c) {
        cout << *c;
        ++c;
    }
}

int main()
{
    std::string = "Hello!";
    std::string res = test;
    print_array(test.c_str());
    print_array(res.c_str());
}
0 голосов
/ 18 января 2020

В strcpy вам нужно создать размер символа.

char* mystrdup(const char* c)
{
    int size = strlength(c);
    char* result = new char[size];
    copy(c, c + size, result);
    return result;      
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...