Dziwne zachowanie funkcji get, błędy wskaźników oraz wczytywanie pełnych zdań

0

Witam. Piszę aplikację związaną z przetwarzaniem łańcuchów znaków. Postanowiłem nie korzystać z klasy string i przez to napotykam co chwilę na przeszkody. Chciałem stworzyć możliwość użytkownikowi wprowadzania pełnych zdań poprzez konsolę do programu aby później mógł na tym zdaniu operować (wklejanie innych łańcuchów, usuwanie liter itd).
Stworzyłem klasę modelującą mój łańcuch, przeciążyłem dla tej funkcji operator wejścia. Zaprezentuję teraz mój kod:

 
#ifndef _CHAIN_HPP
#define _CHAIN_HPP

#include <iostream>
#include <string.h>

using namespace std;

class chain
{
	public:
	chain();
	~chain();
	int add_end(chain &temp_c);
	int rep(chain &temp_c, unsigned int offset);	
	int len();
	int get_len();
	char* get_text();
	void set_text(char *temp_p);
	friend ostream& operator<< (ostream &out, chain &c);
	friend istream& operator>> (istream &in, chain &c);  
	private:
	char *p;
	int p_length;
};

#endif
 
#include "chain.hpp"

void chain::set_text(char *temp_p)
{
 p = NULL;
 p = new char[];
 strcpy(p, temp_p);
 len();
}

char* chain::get_text()
{
 return p;
}

int chain::len()
{
 p_length = strlen(p);
 return 1;
}

int chain::get_len()
{
 return p_length;
}

int chain::add_end(chain &temp_c)
{
 char *p_temp = new char;
 strcpy(p_temp, p);
 strcat(p_temp, temp_c.get_text());
 set_text(p_temp);
 return 1;
}


ostream& operator<< (ostream &out, chain &c)         
 {
   out << c.p;
   return out;
 }

istream& operator>> (istream &in, chain &c)         
 {
 char s, *p_s = new char;
 int i = 0;
 while(1)
 {
  s = in.get(); 
  if(s != '\n')
   {
   *(p_s+i) = s;
   i++;
   }
   else
   break;
 }
  *(p_s+i) = '\0';
 c.set_text(p_s);
 return in;
 }
#include <iostream>
#include "chain.hpp"

using namespace std;

int main()
{
 chain c1;

 cout << "Wprowadz lancuch znakow(znak, wyraz, zdanie): " ;
 cin >> c1;
 cout << "Wprowadzony lancuch: " << c1 << endl;
 cout << "Dlugosc lancucha: " << c1.get_len() << endl;	

 return 0;
}
 

Program kompiluję pod Linuxem. Nie występują błędy przy kompilacji, okropne błędy natomiast występują podczas pracy.
Zasadniczy problem i chyba powodujący dalsze jest to, że kiedy w konsoli wpisuję łańcuch znaków to jest on wczytywany bardzo dobrze ze spacjami itd. jako całe zdanie ale dopóki jest krótszy niż 13 znaków. Nigdzie nie deklaruję długości pojedynczego łańcucha i stąd moje zdziwienie skąd nagle to ograniczenie. Błędy jakie się pojawiają to "Backtrace" i "Memory map" i masa innych. Podejrzewam, że to problem wskaźników i tego że nie deklaruję ile miejsca będą zajmować łańcuchy, ale kiedy zadeklarowałem łańcuch w ten sposób

 p = new char[p_length];
 strcpy(p, temp_p);

Otrzymałem dokładnie to samo. Zastanawiające jest to, że kiedy ten sam kod kompiluję i buduję w program "Geany" to "Segmantation fault" dostaję dopiero gdy łańcuchy są o wiele dłuższe niż 13 ale jednak błędy są.
Co o tym myślicie ?

0

Proponuje przede wszystkim zainstalować valgrind a później:

# g++ -g3  *.cpp
# valgrind ./a.out
 

Dostaniesz wskazanie, co do linijki, gdzie piszesz po nie przydzielonej pamięci.
A malloc czy new na współczesnych systemach najczęściej niezależnie od argumentu przydzielają minimum 8-16 bajtów zawsze wyrównane do przynajmniej 4-8 bajtów więc wyjechanie o bajt czy dwa poza zarezerwowaną pamięć może ujść na sucho, oczywiście do czasu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1