Hilfe mit Fehler in C Programmierung

Hallo Leute,

Ich komme bei einem kniffligen Problem bei einem Programm in C nicht
weiter.

Ich weiss genau, wo der Fehler ist, kann aber nicht verstehen wieso.

AB_Nodo* AB_Ricerca::Ins_SA(T_parola parola, T_tag tag, AB_Nodo* pn)
{
  if (pn == NULL)
  {
  cout << parola << "\n";
    dimensione++;
    pn = new AB_Nodo;
    pn->parola = new char[strlen(parola)];
    for (int k = 0; k <= 20; k++)
    pn->score[k] = 0;
   strcpy(pn->parola, parola); <- Hier ist der Fehler!
  cout << pn->parola << "\n";

    pn->totale = 1;
    pn->tag[1] = new char[strlen(tag) + 1];
    strcpy(pn->tag[1], tag);
    pn->score[1] = 1;
    pn->sin = pn->des = NULL;

Im Bild sieht man die Ergebnisse des cout.
das Wort parola wird korrekt als Parameter an die Funktion geschickt,
aber sobald ich es ins pn->parola kopiert habe, werden zwei komische Zeichen angehängt..

Da komme ich nicht weiter!
Hat jemand vielleicht 'ne Ahnung?

Erik

errore.jpg

Ciao Erik,

            penso si tratti di questo, anche se non ne sono certo

pn->parola = new char[strlen(parola)];

se usi strlen per calcolare la lunghezza della stringa non viene conteggiato il \0
di terminazione, percio' tu crei una stringa senza null terminator.

Prova ad aggiunger +1

  Andy

Erik Norman wrote:

attachment.htm (2.01 KB)

errore.jpg

Uguale con +1

Infatti non riesco a spiegarmelo.

Ho notato che lo fa solo con parole che sono lunghe oltre 24 caratteri
(MA NON CON TUTTE LE PAROLE PIU LUNGHE DI 24)...
Infatti mi sembra magia..

Avevo provato a fare un check su
if (strlen(parola) != strlen(pn->parola))
ma niente..
anzi, ho dovuto creare due integer, assegnare i valori di strlen
rispettivamente e se questi non erano uguali tagliare via gli ultimi due
caratteri!
Ma questo non dovrebbe essere necessario!

Erik

Mi faresti vedere la struttura AB_Nodo che usi in

pn = new AB_Nodo;

?

Erik Norman wrote:

attachment.htm (3.19 KB)

Prova a mandarci un file a) completo ma b) minimale che c) riproduce
l'errore, se vuoi metterci nelle condizioni di vedere cosa possa essere il
problema.

Per favore rispetta tutte e tre le condizioni sopra, perché spesso capita che
nel ridurre il codice fino alle ossa l'errore diventa evidente e non hai più
bisogno di aiuto. Se no, abbiamo un codice che possiamo eseguire sul nostro
PC.

Saluti,
thomas

Erik Norman ha scritto:

Hallo Leute,

Ich komme bei einem kniffligen Problem bei einem Programm in C nicht
weiter.

Ich weiss genau, wo der Fehler ist, kann aber nicht verstehen wieso.

AB_Nodo* AB_Ricerca::Ins_SA(T_parola parola, T_tag tag, AB_Nodo* pn)
{
  if (pn == NULL)
  {
  cout << parola << "\n";
    dimensione++;
    pn = new AB_Nodo;
    pn->parola = new char[strlen(parola)];
    for (int k = 0; k <= 20; k++)
    pn->score[k] = 0;
   strcpy(pn->parola, parola); <- Hier ist der Fehler!
  cout << pn->parola << "\n";

    pn->totale = 1;
    pn->tag[1] = new char[strlen(tag) + 1];
    strcpy(pn->tag[1], tag);
    pn->score[1] = 1;
    pn->sin = pn->des = NULL;

Im Bild sieht man die Ergebnisse des cout.
das Wort parola wird korrekt als Parameter an die Funktion geschickt,
aber sobald ich es ins pn->parola kopiert habe, werden zwei komische Zeichen angehängt..

Da komme ich nicht weiter!
Hat jemand vielleicht 'ne Ahnung?

  you should use std::string to get the best from C++

  (see strings and standard C++ library)

  or use strdup() as the fastest way in traditional C:

  pn->parola = strdup(parola);

  Cheers,

Problem gelöst:

  pn->parola = strdup(parola);
  pn->parola[strlen(parola)]='\0';

Es bleibt aber immer noch die Frage offen, WIESO diese Zeichen
aufgetaucht sind. Naja, es funktioniert ja! :slight_smile:

Erik Norman ha scritto:

Problem gelöst:

  pn->parola = strdup(parola);
  pn->parola[strlen(parola)]='\0';

Es bleibt aber immer noch die Frage offen, WIESO diese Zeichen
aufgetaucht sind. Naja, es funktioniert ja! :slight_smile:

  If you have to manually end the new buffer from strdup(parola) with \0
so, parola is not a good container... may be out of that function
somebody have to alloc enought space in parola to contain \0 at the end
of it.

  Take in account that if you do a thing like this:

  char *pippo[24];
  strcpy(pippo,"123456789-123456789-123456789-");

  where strlen(pippo) could differ from sizeof(pippo) or not (depending
compiler and some other things) AND segmentation fault doesn't happen
usually... because gcc alloc 4kb (a page size) for each buffer (but not
for that var that are on the stack or in a register).
  It depends on many things like arch, kernel, compiler, etc. etc.

  Cheers,