Не могу понять почему не выводится текст

#include <iostream>
using namespace std;
class myString
{
    char* string;
    int length;
public:
    myString(char* t_string);
    void showString();
};
myString::myString(char* t_string)
{
    string=new char[5];
    while(*t_string)
    {
        *string++=*t_string++;
    }
}
void myString::showString()
{
    while(*string++)
    {
        cout<<*string;
    }
}
            
int main()
{
    myString string("Hello");
    string.showString();
    return 0;
}

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


Ответы (2 шт):

Автор решения: Harry

"Да понять-то его, надёжа-государь, немудрено" (с):

myString::myString(char* t_string)
{
    string=new char[5];
    while(*t_string)
    {
        *string++=*t_string++;
    }
}

Куда после этого указывает string? Правильно, за конец реальной строки. Кстати, это ведет еще и к утечке памяти, но это второй вопрос...

И что теперь должен выводить этот код?

void myString::showString()
{
    while(*string++)
    {
        cout<<*string;
    }
}
     

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

Update

Вот код более-менее нормального класса без утечек...

#include <iostream>
using namespace std;

class myString
{
    char* s;
public:
    myString(const char* t);
    myString(const myString& m)
        :myString(m.s){};
    myString& operator=(myString m)
    {
        char * t = s;
        s = m.s;
        m.s = t;
        return *this;
    }
    void showString();
    ~myString() { delete[] s; }
};

myString::myString(const char* t)
:s(new char[strlen(t)+1])
{
    char * q = s;
    while(*q++ = *t++);
    // Проще strcpy(s,t);
}

void myString::showString()
{
    char * q = s;
    while(*q)
    {
        cout<<*q++;
    }
    // Проще cout << s;
}

int main()
{
    myString s("Hello");
    s.showString();
    return 0;
}
→ Ссылка
Автор решения: cpp-userium

Вы двигает указатель на строку, после того как вы запускаете вывод он уже указывает за строку.

Вообще там не всегда пустой вывод, просто так повезло, вообще можно поймать мусор если несколько раз попробовать.(MVS)

Если откроете в дебагере Visual Studio, там четко и пошагово все видно

#include <iostream>
using namespace std;
class myString
{
    int length;
    char* string;
public:
    myString(const char* t_string);
    void showString();
};
myString::myString(const char* t_string)
{
    string = new char[strlen(t_string)];
    char* ptr_start = string;
    do
    {
        *ptr_start++ = *t_string++;
    } while (*ptr_start != '\0');

}
void myString::showString()
{
    char* ptr = string;
    do
    {
        std::cout << *(ptr++);
    } while (*ptr != '\0');
}

int main()
{
    myString string("Hello");
    string.showString();
    return 0;
}

Можно и без указателей сделать


#include <iostream>
using namespace std;
class myString
{
    size_t length;
    char* string;
public:
    template<size_t N>
    myString(const char(&t_string)[N])
        : length(N)
    {
        string = new char[length];
        strcpy_s(string,length, t_string);
    };
    void showString()
    {
        std::cout << string;
    }
};
int main()
{
    myString str("hello");
    str.showString();
    return 0;
}
→ Ссылка