C: verkette liste ergibt crash

jkallup

Erfahrenes Mitglied
warum führt die Schleife in der main Funktion zu einen crash?
Danke für Hilfe, Tipps und code snippets

Code:
#include "stdafx.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <malloc.h>

#include <iostream>
#include <stack>
using namespace std;

#define TOK_NUMBER 200
#define TOK_ID 201
#define TOK_FILE 202
#define TOK_IF 203
#define TOK_ELSE 204
#define TOK_ENDIF 205

FILE *finput;
int lineno = 1;
int tokentype = 0;
char token_buffer[2048];
char numvalstr[256];
double numval;

class listenelement {
    char *val_name;
    listenelement *next;
public:
	listenelement(void);
    void datenSetzen(char *datenneu); 
    listenelement *einfuegen(char *datenneu);
    void ausgeben();
};

listenelement::listenelement(void)
{
}

// --------------------
// die Zeichenkette in das Element schreiben
// --------------------
void listenelement::datenSetzen(char *datenneu) {
	val_name = (char*) malloc(2048);
    strcpy(val_name,datenneu);
}

//
// neues Element am Ende der Liste einfügen
//
listenelement *listenelement::einfuegen(char *datenneu)
{	
	// --------------------------
    // ein neues Element einfügen
	// ---------------------------
    next = new listenelement;
	next->val_name = new char[strlen(datenneu)+1];
	strcpy(next->val_name,datenneu);
	return next;
}
 
//Alle Elemente der Liste ausgeben
void listenelement::ausgeben()
{
    if (next != NULL)
	{
		printf("->%s\n",val_name);
        next->ausgeben();
	}
}


int skip_white_space (void)
{
  int c;
  int inside;

  c = getc (finput);

  for (;;)
    {
      int cplus_comment;

      switch (c)
	{
	case '/':
	  /* FIXME: Should probably be merged with copy_comment.  */
	  c = getc (finput);
	  if (c != '*' && c != '/')
	    {
	      printf("unexpected `/' found and ignored");
	      break;
	    }
	  cplus_comment = (c == '/');

	  c = getc (finput);

	  inside = 1;
	  while (inside)
	    {
	      if (!cplus_comment && c == '*')
		{
		  while (c == '*')
		    c = getc (finput);

		  if (c == '/')
		    {
		      inside = 0;
		      c = getc (finput);
		    }
		}
	      else if (c == '\n')
		{
		  lineno++;
		  if (cplus_comment)
		    inside = 0;
		  c = getc (finput);
		}
	      else if (c == EOF)
		  {
			printf("unterminated comment");
			exit(1);
		  }
	      else
		c = getc (finput);
	    }

	  break;

	case '\n':
	  lineno++;

	case ' ':
	case '\t':
	case '\f':
	  c = getc (finput);
	  break;

	default:
	  return c;
	}
  }
}

int lex(void)
{
	int c;
	c = skip_white_space();

	switch (c)
	{
		case EOF:
		return EOF;

		case 'A':    case 'B':    case 'C':    case 'D':    case 'E':
		case 'F':    case 'G':    case 'H':    case 'I':    case 'J':
		case 'K':    case 'L':    case 'M':    case 'N':    case 'O':
		case 'P':    case 'Q':    case 'R':    case 'S':    case 'T':
		case 'U':    case 'V':    case 'W':    case 'X':    case 'Y':
		case 'Z':
		case 'a':    case 'b':    case 'c':    case 'd':    case 'e':
		case 'f':    case 'g':    case 'h':    case 'i':    case 'j':
		case 'k':    case 'l':    case 'm':    case 'n':    case 'o':
		case 'p':    case 'q':    case 'r':    case 's':    case 't':
		case 'u':    case 'v':    case 'w':    case 'x':    case 'y':
		case 'z':
	    case '_':

		strcpy(token_buffer,"");

		while (isalnum (c) || c == '_' || c == '.')
		{
			char buffer[5];
			sprintf(buffer,"%c",c);
			strcat(token_buffer,buffer);
			c = getc (finput);
		}

		if (strcmp(token_buffer,_strlwr("file")) == 0) return TOK_FILE; else
		if (strcmp(token_buffer,_strlwr("if")) == 0) return TOK_IF; else
		if (strcmp(token_buffer,_strlwr("else")) == 0) return TOK_ELSE; else
		if (strcmp(token_buffer,_strlwr("endif")) == 0) return TOK_ENDIF; else
		return TOK_ID;
		break;

		case '0':    case '1':    case '2':    case '3':    case '4':
		case '5':    case '6':    case '7':    case '8':    case '9':
		case '.':
		{
			strcpy(numvalstr,"");

			while (isdigit (c) || c == '.')
			{
				char buffer[5];
				sprintf(buffer,"%c",c);
				strcat(numvalstr,buffer);
				c = getc (finput);
			}
			numval = atof(numvalstr);
			return TOK_NUMBER;
		}
		break;
	}
	return -1;
}

int main(int argc, char **argv)
{
	char s[2048];
	int c;

	listenelement *listenAnfang;
	listenelement *listenEnde;

	listenAnfang = new listenelement;
	listenEnde = new listenelement;

	finput = stdin;
	lineno = 1;
	for (;;)
	{
		tokentype = lex();
		if (tokentype == EOF) break;
		if (tokentype == TOK_ID)
		{
			strcpy(s,token_buffer);
			c = skip_white_space();
			if (c == '=')
			{
				tokentype = lex();
				if (tokentype == TOK_NUMBER)
				{
					printf("rxpr: %s, %g,  %s\n",s,numval,numvalstr);
 
					listenAnfang->datenSetzen("Element 0");				
					listenEnde = listenAnfang;
					listenEnde = listenEnde->einfuegen("buffer");

					char buffer[300];
					int schleife;
					//in einer Schleife mehrere Elemente einfügen
					for (schleife = 0; schleife < 3; schleife++)
					{
						sprintf(buffer,"Element: %d\n",schleife);
						listenEnde = listenEnde->einfuegen(buffer);
					}
 
					listenAnfang->ausgeben();
				}
			}
		}
	}
}
 
Hi

Wann kommt es bei dir zu einem Crash?
Kanns nicht reproduzieren.
Und für was soll das Programm eigentlich gut sein?
 
Hi.

Bei welcher Eingabe stürzt das Programm denn ab?

Stringliterale in C/C++ sind konstant / immutable.

C++:
_strlwr("file"); // Fehler "file" ist ein "const char*", außerdem ist es schon alles klein.
..
listenEnde = listenEnde->einfuegen("buffer"); // Fehler: "buffer" ist ein "const char*" erwartet wird ein "char*", ändere den Parametertyp.
Du mischt malloc und new[] Aufrufe. Eine Schlechte Idee. Und du gibst den Speicher nicht frei.

Gruß
 

Neue Beiträge

Zurück