Странные выводы из добавленного char * в C ++ - PullRequest
3 голосов
/ 05 января 2020

Я просто писал простой код, а потом увидел что-то странное. Код должен добавить строку в другую строку. Выходные данные новой добавленной строки выводят не только правильную добавленную строку, но также каждый раз четыре раза добавляют число 2, и я не понимаю, почему. Я думал, что это какая-то утечка памяти, которую я упустил из виду, или что-то в этом роде, но там он выводит каждый раз одни и те же четыре числа.

Код:

#include <iostream>

using namespace std;


unsigned int getStrSize(const char* string)
{
    unsigned int size = 0;
    while (string[size] != '\0')
    {
        size++;
    }
    return size;
}

int main()
{
    const char* bla1 = "hello";
    const char* bla2 = " blaah";

    int size1 = getStrSize(bla1);
    int size2 = getStrSize(bla2);
    int size12 = size1 + size2;

    char* bla12 = new char[size12];

    for (int i = 0; i < size1; i++)
    {
        bla12[i] = bla1[i];
    }
    for (int i = 0; i < size2; i++)
    {
        bla12[i + size1] = bla2[i];
    }
    char* blaNew = bla12;

    cout << bla1 << "\n";
    cout << bla2 << "\n";
    cout << bla12 << "\n";
    cout << blaNew << "\n";
}

Выходы:

hello
 blaah
hello blaah²²²²
hello blaah²²²²

Ответы [ 2 ]

2 голосов
/ 05 января 2020

Вам не хватает ноля:

#include <iostream>

using namespace std;
unsigned int getStrSize(const char* string)
{
    unsigned int size = 0;
    while (string[size] != '\0')
    {
        size++;
    }
    return size;
}

int main()
{
    const char* bla1 = "hello";
    const char* bla2 = " blaah";

    int size1 = getStrSize(bla1);
    int size2 = getStrSize(bla2);
    int size12 = size1 + size2 + 1; // notice +1

    char* bla12 = new char[size12];

    for (int i = 0; i < size1; i++)
    {
        bla12[i] = bla1[i];
    }
    for (int i = 0; i < size2; i++)
    {
        bla12[i + size1] = bla2[i];
    }
    bla12[size12 - 1] = '\0'; // terminate with nil
    char* blaNew = bla12;

    cout << bla1 << "\n";
    cout << bla2 << "\n";
    cout << bla12 << "\n";
    cout << blaNew << "\n";

    delete[] bla12;  // Don't leak memory
    delete[] blaNew; // 
}

Еще лучше подумать об использовании стандартных функций библиотеки:

#include <cstring>
#include <iostream>

int main() {
  const char* bla1 = "hello";
  const char* bla2 = " blaah";

  auto const size1 = std::strlen(bla1);
  auto const size2 = std::strlen(bla2);
  auto const size12 = size1 + size2 + 1;

  char* bla12 = new char[size12];

  std::strcpy(bla12, bla1);
  std::strcat(bla12, bla2);
  char* blaNew = bla12;

  std::cout << bla1 << "\n";
  std::cout << bla2 << "\n";
  std::cout << bla12 << "\n";
  std::cout << blaNew << "\n";

  delete[] bla12;
  delete[] blaNew;
}
1 голос
/ 05 января 2020

Проблема в том, что вы не завершаете нулевой буфер * char. std::cout.operator<<(char*) попытается найти \0 в качестве завершающего символа. Так что вам просто нужно добавить \0 в конце вашего буфера.

Примечание: обратите внимание, чтобы увеличить размер буфера до 1, иначе вы получите доступ / запишете нераспределенную память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...