logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[C++] Dziwne znaki przy wczytywaniu tekstu z cin.getline()

Eureka 170 09 Sty 2012 12:41 1713 1
REKLAMA
  • #1 10371454
    Eureka 170
    Poziom 22  
    Posty: 534
    Pomógł: 38
    Ocena: 15
    Witam, mam oto taki kod:

    main.cpp
    #include <iostream>
    #include <string.h>
    #include "Text.h"
    
    using namespace std;
    
    int main()
    {
        for(;;)
        {
            cout << "***********MENU***************" << endl;
            cout << "(1) Dodaj dwa teksty" << endl;
            
            int choice;
            cin >> choice;
            switch(choice)
            {
                case 1:
    
                char * tempFirstText  = new char[100];
                char * tempSecondText = new char[100];
    
                char *firstText;
                char *secondText;
    
    
    
                cout << "Podaj pierwszy tekst" << endl;
                cin.ignore();
                cin.getline(tempFirstText,100);
                cout << "Podaj drugi tekst" << endl;
                cin.ignore();
                cin.getline(tempSecondText,100);
    
                firstText = new char[strlen(tempFirstText)+1];
                secondText = new char[strlen(tempSecondText)+1];
    
                for(int i=0;i<strlen(tempFirstText);i++)
                {
                    firstText[i] = tempFirstText[i];
                }
                firstText[strlen(tempFirstText)] = '\0';
    
                for(int i=0;i<strlen(tempSecondText);i++)
                {
                    secondText[i] = tempSecondText[i];
                }
                secondText[strlen(tempSecondText)] = '\0';
                Text A(firstText);
                Text B (secondText);
    
                cout << "Polaczony tekst ma postac: " << (A+B)->GetText() << endl;
    
            }
        }
        return 0;
    }
    


    text.cpp
    
    #include "Text.h"
    #include <string.h>
    #include <iostream>
    
    Text:: Text( const char  * lString)
    {
        text = new char[strlen(lString)];
        for(int i=0;i<strlen(lString);i++)
        {
            text[i] = lString[i];
        }
    
    }
    Text * Text::operator+(const Text& variable)
    {
        int totalLength = strlen(this->text)+ variable.GetLength();
        int counter = 0;
        char *allText = new char[totalLength];
        for(int i=0;i<totalLength;i++)
        {
            if(i<strlen(this->text))
            {
                allText[i] = this->text[i];
            }
            else
            {
                allText[i] = variable.text[counter];
                counter++;
            }
        }
        Text *newText = new Text(allText);
        return newText;
    
    }


    text.h
    class Text
    {
        public:
        ~Text(){}
        Text(const char *);
        Text * operator+(const Text&);
        private:
        char * text;
    }
    


    Program oczywiście jest jeszcze niedokończony.
    Problem polega tutaj na tym, że program wyświetla mi dziwne znaki: http://imageshack.us/photo/my-images/607/dziwneznaki.jpg/
    Przecież tworzę tablicę, która ma pomieścić tyle znaków ile potrzeba, to skąd nagle biorą się te dodatkowe znaki? Może problem jest banalny, ale dawno nie pisałem nic w C++ więc mam nadzieję, że mi pomożecie :)
  • REKLAMA
  • #2 10371609
    szczepar
    Poziom 20  
    Posty: 333
    Pomógł: 27
    Ocena: 59
    strlen- zwraca ci długośc Stringa bez znaku terminującego string czyli 0x00.
    dodanie dwóch stringów powinno tworzyć stringa o 1 dłuższego niż wartość strlen jaka jest zwracana. Na ostatnim miejscu natomiast trzeba dodać znak terminujący 0x00.

    Funkcje IO w C (char * to string z C ) operuja na stringach opartych na tablicy charów zakonczonych 0x00 , brak tego znaku powoduje wyswietlanie do momentu znalezienia 0x00 w pamięci.

    Edytka mowi :
    Masz sumowanie 2 stringów w przeciążonym operatorze przypisania zrobione bez zakonczenia stringa 0x00.
    Dodatkowo czemu sumujesz ręcznie stringi for-em ?

    Podpowiem - strncpy

    Tu nie sprawdzony napisany na szybko przyklad kopiowania 2 stringow do 3ego.

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Dodatkwo operator dodawania bedzie zle działać z A=A+A;
    Bo zwróci wskaznik na nowy obiekt , ale nie zwolni pamieci A i mamy piekny przykład "memory leek" :)
REKLAMA