warum führt die Schleife in der main Funktion zu einen crash?
Danke für Hilfe, Tipps und code snippets
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();
}
}
}
}
}