Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Überprüfung der Eingabe

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
04.04.2005, 14:29 Uhr
rejo



Hallo Leute!
Kann vielleicht mir jemand helfen ???

Also wenn man von Benutzer eine Eingabe erwartet und die Eingabe ein Integer sein soll...
Und der Benutzer gibt "versehentlich" ein Buchstaben ein.... wie kann man das überprüfen???
Würd gern wissen wie es in C bzw. C++ geht!

Danke schon im vorraus!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.04.2005, 14:39 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


lies es als string ein und guck dann nach ob das eingegeben eine zahl ist... wenn ja in eine zahl umwandeln (z.b. mit atoi) und wenn nein den benutzer aufs übelstes beschimpfen...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.04.2005, 15:04 Uhr
rejo



Danke!
Wie überprüft man ob es eine Zahl ist ?

EDIT: Hat sich erledigt

Dieser Post wurde am 04.04.2005 um 15:08 Uhr von rejo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
04.04.2005, 15:25 Uhr
Spacelord
Hoffnungsloser Fall


Wenn deine Variable vom Typ int ist und es liegt was anderes an gibt es ne interne Fehlermeldung.Die kannst du mit cin.fail() abfragen.Oder einfach if(!cin).Dann kannst du mit cin.clear() die Fehlerinformation löschen und z.B. mit cin.seekg(0L,ios::end) dafür sorgen dass die "falschen" Daten im Stream übersprungen werden.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
04.04.2005, 20:15 Uhr
0xdeadbeef
Gott
(Operator)


Das Problem scheint ziemlich häufig aufzutauchen. Ich hab mal ein Stück Code in die Sourcecorner gestellt, das das Problem in den meisten Fällen lösen dürfte: www.dev-geeks.org/index.php?module=scripts&sub=2&action=show&id=50
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
04.04.2005, 20:31 Uhr
rejo



Hallo hab da ein Fehler den ich irgendwie nicht verstehe bzw. es lösen kann.
Es ist so...
wenn man bei init_NFA_table() das auskommentierte lässt und alles andere weglässt dann gehts! aber jetzt hab ich ne eingabe geschrieben und die tabelle bleibt bis zum funktionsaufruf von nfa_to_dfa gleich,.. dann in der funktion hohlt er von der tabelle etwas was garnicht drinn steht... =( kann mir jemand helfen.


C++:
#include <stdio.h>
#include <string.h>
#include "hilfschirm.cpp"
#include <conio.h>
#include <stdlib.h>
#define STATES 10
#define SYMBOLS 5

int N_symbols;
int NFA_states;
char *NFAtab[STATES][SYMBOLS];
char *NFA_finals;

int DFA_states;
int DFAtab[STATES][SYMBOLS];
char DFA_finals[STATES];

char statename[STATES][STATES];


void put_dfa_table(int tab[][SYMBOLS], int nstate, int nsymbol, char *finals)
{
    int i, j;
    
    printf("   | ");
    
    for (i = 0; i < nsymbol; i++) printf(" %c ", 'a'+i);
    
    printf("\n---+--");
    for (i = 0; i < nsymbol; i++) printf("---");
    printf("\n");

    for (i = 0; i < nstate; i++)
    {
        printf(" %c | ", 'A'+i);
        for (j = 0; j < nsymbol; j++)
            printf(" %c ", 'A'+tab[i][j]);
        
        printf("\n");
    }
    printf("Start state = A\nFinal states = %s\n", finals);
}

void put_table(int nsymbol, int nstate)
{
    int i;
    printf("   | ");
    
    for (i = 0; i < nsymbol; i++) printf(" %c ", 'a'+i);
    
    printf("\n---+--");
    for (i = 0; i < nsymbol; i++) printf("---");
    printf("\n");

    for (i = 0; i < nstate; i++)
    {
        printf(" %c | \n", 'A'+i);
    }
}

void init_NFA_table()
{
    /*NFAtab[0][0] = "01";    NFAtab[0][1] = "0";
    NFAtab[1][0] = "2";        NFAtab[1][1] = "";
    NFAtab[2][0] = "3";        NFAtab[2][1] = "";
    NFAtab[3][0] = "";        NFAtab[3][1] = "4";
    NFAtab[4][0] = "45";    NFAtab[4][1] = "4";
    NFAtab[5][0] = "6";        NFAtab[5][1] = "";
    NFAtab[6][0] = "";        NFAtab[6][1] = "";
    
    NFA_states = 7;
    DFA_states = 0;
    N_symbols = 2;
    NFA_finals = "36";*/

    int i, check, j, k, p = 0;
    char temp[STATES], temp2[2*STATES][STATES];

    for(i = 0; i < STATES; i++)
    {
        temp[i] = '\0';
    }

    for(i = 0; i < (2*STATES); i++)
        for(j = 0; j < STATES; j++)
            temp2[i][j] = '\0';

    do
    {
        printf("Enter number of NFA states: ");
        scanf("%s", temp);
        for(i = 0; temp[i] != '\0'; i++)
        {
            if(isdigit(temp[i]))
                check = 1;

            else
                check = 0;
        }

        NFA_states = atoi(temp);

    }while((check == 0 && printf("Error - Enter a number\n")) || ((NFA_states < 1 || NFA_states > 10) && printf("Error - Out of range (1 - 10)\nfd")));

    for(i = 0; i < STATES; i++)
        temp[i] = '\0';

    do
    {
        printf("Enter number of symbols: ");
        scanf("%s", temp);
        for(i = 0; temp[i] != '\0'; i++)
        {
            if(isdigit(temp[i]))
                check = 1;

            else
                check = 0;
        }

        N_symbols = atoi(temp);

    }while((check == 0 && printf("Error - Enter a number\n")) || ((N_symbols < 1 || N_symbols > 5) && printf("Error - Out of range (1 - 5)\nfd")));

    for(i = 0; i < STATES; i++)
    {
        temp[i] = '\0';
    }

    do
    {
        printf("Enter NFA final states: ");
        scanf("%s", temp);
        for(i = 0; temp[i] != '\0'; i++)
        {
            if(isalpha(temp[i]))
                check = 1;

            else
                check = 0;
        }

    }while(check == 0 && printf("Error - Enter a character\n"));

    NFA_finals = temp;

    for(i = 0; i < STATES; i++)
        temp[i] = '\0';

    clrscr();
    put_table(N_symbols,NFA_states);

    for(j = 1; j <= NFA_states; j++)
    {
        for(k = 1; k <= N_symbols; k++)
        {
            switch(k)
            {
                case 1: gotoxy(k+6,j+2); break;
                case 2: gotoxy(k+6+2,j+2); break;
                case 3: gotoxy(k+6+4,j+2); break;
                case 4: gotoxy(k+6+6,j+2); break;
                case 5: gotoxy(k+6+8,j+2); break;
            }
            printf("x");
            gotoxy(0,20);
            do
            {
                printf("Enter states (e.g.:\"AB\"): ");
                scanf("%s", temp);
                for(i = 0; temp[i] != '\0'; i++)
                {
                    if(isalpha(temp[i]))
                        check = 1;
                    else
                        check = 0;
                }

            }while(check == 0 && printf("Error - Enter a characters\n"));

            for(i = 0; i < STATES && temp[i] != '\0'; i++)
            {
                switch(toupper(temp[i]))
                {
                    case 'A': strcat(temp2[p],"0"); break;
                    case 'B': strcat(temp2[p],"1"); break;
                    case 'C': strcat(temp2[p],"2"); break;
                    case 'D': strcat(temp2[p],"3"); break;
                    case 'E': strcat(temp2[p],"4"); break;
                    case 'F': strcat(temp2[p],"5"); break;
                    case 'G': strcat(temp2[p],"6"); break;
                    case 'H': strcat(temp2[p],"7"); break;
                    case 'I': strcat(temp2[p],"8"); break;
                    case 'J': strcat(temp2[p],"9"); break;
                        
                    default: strcat(temp2[p],"\0");
                }
            }
            NFAtab[j-1][k-1] = temp2[p];
            p++;
        }
    }
}

void string_merge(char *s, char *t)
{
    char temp2[STATES];
    char *r = temp2;
    char *p = s;

    while (*p && *t)
    {
        if (*p == *t)
        {
            *r++ = *p++;
            t++;
        }
        
        else if (*p < *t)
            *r++ = *p++;
        
        else
            *r++ = *t++;
    }
    
    *r = '\0';
    
    if (*p)    strcat(r, p);
    
    else if (*t) strcat(r, t);

    strcpy(s, temp2);
}

void get_next_state(char *nextstates, char *cur_states, char *nfa[STATES][SYMBOLS], int symbol)
{
    int c;
    char temp[STATES];
    
    temp[0] = '\0';

    for (c = 0; c < strlen(cur_states); c++)
        string_merge(temp, nfa[cur_states[c]-'0'][symbol]);
    
    strcpy(nextstates, temp);
}

int state_index(char *state, char state_name[][STATES], int *pn)
{
    int k;

    for (k = 0; k < *pn; k++)
    {
        if (!strcmp(state, state_name[k]))
            return k;
    }

    strcpy(state_name[k], state);

    return (*pn)++;
}

int nfa_to_dfa(char *nfa[STATES][SYMBOLS], int n_nfa, int n_sym, int dfa[][SYMBOLS])
{
    int i = 0;
    int n = 1;
    
    char nextstate[STATES];
    int j;
    
    strcpy(statename[0], "0");
    
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n_sym; j++)
        {
            get_next_state(nextstate, statename[i], nfa, j);
            dfa[i][j] = state_index(nextstate, statename, &n);
        }
    }

    return n;
}
void get_DFA_finals(char *dfinal, char *nfinal, char state[][STATES], int dfa_s)
{
    int i, j, k=0, n=strlen(nfinal);

    for (i = 0; i < dfa_s; i++)
    {
        for (j = 0; j < n; j++)
        {
            if (strchr(statename[i], nfinal[j]))
            {
                dfinal[k++] = 'A'+i;
                break;
            }
        }
    }
    dfinal[k] = '\0';
}

/*void syntaxcheck(char word[],int dfa[][SYMBOLS],char *dfinal)
{
    int i, j, cur_state;
    printf("\nWord: %s",word);
    
    for(i = 0; i < strlen(word); i++)
    {
        for(j = 0; j < STATES && dfinal[j] != '\0'; j++)
        {
            if(word[i] == 'a')
        }
    }
}*/


int main()
{
    init_NFA_table();
    DFA_states = nfa_to_dfa(NFAtab, NFA_states, N_symbols, DFAtab);
    get_DFA_finals(DFA_finals,NFA_finals,statename,DFA_states);
    put_dfa_table(DFAtab, DFA_states, N_symbols,DFA_finals);
    //syntaxcheck("abaca",DFAtab,DFA_finals);
    return 0;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
04.04.2005, 20:32 Uhr
rejo



hilfschirm.cpp fehlt ...

C++:
// hilfschirm.cpp
/* Hier folgen einige Funktionen, die man beim Programmieren am
   Textbildschirm von Borland gewöhnt ist, aber im MS fehlen  
  
   void clrscr ()
        löscht den Schirm, positioniert Cursor links oben

   void gotoxy (int x, int y)
        positioniert Cursor auf angegebene Spalte(1-..), Zeile(1-..)
    
   int wherex ()
        gibt zurück, wo auf welcher Spalte (1-..) gerade der Cursor steht

   int wherey ()
        gibt zurück, wo auf welcher Zeile (1-..) gerade der Cursor steht

   int wievielezeilen ()
        gibt zurück, wieviele Zeilen der Schirm gross ist (meist 25)

   int wievielespalten ()
        gibt zurück, wieviele Spalten der Schirm gross ist (meist 80)

   void textcolor(int farbcode)
        setzte die Textfarbe für die nachfolgenden Ausgaben

   void textbackground(int farbcode)
        setzte die Hintergrundfarbe für die nachfolgenden Ausgaben


   void delay (millisekunden);
        wartet die angegebene Zeit (nur für kurzeZeiträume sinnvoll)


   int random (int obergrenze)
        liefert eine Zufallszahl im Wertebereich von 0 bis obergrenze - 1

*/


/* was aus der  conio.h ist brauchbar

   int getch()    // liest ein Zeichen bzw. besser eine Taste von der Tastatur
                // Ist auf der Taste ein Zeichen, so erhält man den Ascii Code
                // bei Spezialtasten erhält man 0 oder E= - man muss dann noch
                // einmal lesen um einen Code für die jeweilige Spezialtaste
                // (Funktionstasten, Cursortasten) zu erhalten
   int kbhit ()    // hat der Benutzer auf eine Taste gedrückt ?
                // Wenn man mit getch liest, dann wartet getch bis der
                // Benutzer eine Taste drückt - in der Zwischenzeit
                // kann das Programm nichts tun. kbhit wartet nicht sondern
                // schaut nur nach ob einen Taste gedrückt ist. Wenn ja
                // kann das Programm mit getch lesen, wenn nein kann man
                // z.b. etwas ausgeben und später nochmal mit kbhit abfragen
   void putch(ascci-code)
                // gibt ein Zeichen aus, Vorteil gegenüber printf ist, dass mehr
                // ascii codes darstellbar sind.
*/




#include <windows.h>
#include <time.h>
#include <stdlib.h>

    // diese Funktionen nutzen die recht mächtige Programmierfähigkeit
    // der WIN32 Console, die einem Anfänger nicht direkt zugemutet
    // werden kann

HANDLE holeoutput ()    // Hilfsfunktion für die Ausgabe
{        // Variante 1, nehme den stdout

    return GetStdHandle (STD_OUTPUT_HANDLE);

        // Variante 2 - nehme immer die Console

    return CreateFile(
                     "CONOUT$", GENERIC_WRITE | GENERIC_READ,
                     FILE_SHARE_READ | FILE_SHARE_WRITE,
                     0L, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0L);
}


void clrscr ( )
{
   COORD coordScreen = { 0, 0 };    /* Struktur für Position am Schirm */
   HANDLE hConsole;                    /* Win32 Fenster Zugriffshandle */
   BOOL bSuccess;
   DWORD cCharsWritten;
   CONSOLE_SCREEN_BUFFER_INFO csbi; /*  buffer info Struktur */
   DWORD dwConSize;                 /* Zeichenzahl am Schirm */


   hConsole = holeoutput ();

   bSuccess = GetConsoleScreenBufferInfo( hConsole, &csbi );

   dwConSize = csbi.dwSize.X * csbi.dwSize.Y; // anz-spalten * anz-zeilen

   /* alles blanks */
   bSuccess = FillConsoleOutputCharacter( hConsole, (TCHAR) ' ',
      dwConSize, coordScreen, &cCharsWritten );

   bSuccess = GetConsoleScreenBufferInfo( hConsole, &csbi );

   /* now set the buffer's attributes accordingly   ?? wozu wohl  */
   bSuccess = FillConsoleOutputAttribute( hConsole, csbi.wAttributes,
      dwConSize, coordScreen, &cCharsWritten );

   /* positioniere cursor auf (0, 0) */
   bSuccess = SetConsoleCursorPosition( hConsole, coordScreen );

   return;
}


int wherex ( )
{
   HANDLE hConsole;
   BOOL bSuccess;
    
   CONSOLE_SCREEN_BUFFER_INFO csbi; /*  buffer info */
  
   hConsole = holeoutput ();
   bSuccess = GetConsoleScreenBufferInfo( hConsole, &csbi );

   return csbi.dwCursorPosition.X +1; // +1 weil geht von 0 weg
}

int wherey ( )
{
   HANDLE hConsole;
   BOOL bSuccess;
    
   CONSOLE_SCREEN_BUFFER_INFO csbi; /*  buffer info */
  
   hConsole = holeoutput ();
   bSuccess = GetConsoleScreenBufferInfo( hConsole, &csbi );

   return csbi.dwCursorPosition.Y ;  // +1 weil geht von 0 weg
}


int wievielespalten ( )   // 1-(80)
{
   HANDLE hConsole;
   BOOL bSuccess;
    
   CONSOLE_SCREEN_BUFFER_INFO csbi; /* buffer info */
  
   hConsole = holeoutput ();
   bSuccess = GetConsoleScreenBufferInfo( hConsole, &csbi );

   return csbi.dwSize.X ;
}

int wievielezeilen ( )   // 1-(25)
{
   HANDLE hConsole;
   BOOL bSuccess;
    
   CONSOLE_SCREEN_BUFFER_INFO csbi; /*  buffer info */
  
   hConsole = holeoutput ();
   bSuccess = GetConsoleScreenBufferInfo( hConsole, &csbi );

   return csbi.dwSize.Y ;
}

void textcolor (int farbcode )   // Zahl 0 - 15 als Farbcode
{
   HANDLE hConsole;
   BOOL bSuccess;
    // WORD    ForeColor;
   WORD    BackColor;
   WORD    wAttributesOld;
    
   CONSOLE_SCREEN_BUFFER_INFO csbi; /* buffer info */
  
   hConsole = holeoutput ();
   bSuccess = GetConsoleScreenBufferInfo( hConsole, &csbi );
   wAttributesOld = csbi.wAttributes;
   // ForeColor = wAttributesOld % 16;   // die rechten 4 bits
   BackColor = (wAttributesOld >> 4) % 16;   // die 4 bits davor

   if (farbcode < 0 || farbcode > 15) farbcode = 0;

   SetConsoleTextAttribute( hConsole, (WORD) ( (BackColor << 4) |
                               (WORD) farbcode) );
    
}

void textbackground (int farbcode )   // Zahl 0 - 15 als Farbcode
{
   HANDLE hConsole;
   BOOL bSuccess;
   WORD    ForeColor ;
    // WORD    BackColor ;
   WORD    wAttributesOld;
    
   CONSOLE_SCREEN_BUFFER_INFO csbi; /* buffer info */
  
   hConsole = holeoutput ();
   bSuccess = GetConsoleScreenBufferInfo( hConsole, &csbi );
   wAttributesOld = csbi.wAttributes;
   ForeColor = wAttributesOld % 16;   // die rechten 4 bits
   //BackColor = (wAttributesOld >> 4) % 16;   // die 4 bits davor

   if (farbcode < 0 || farbcode > 15) farbcode = 0;

   SetConsoleTextAttribute( hConsole, (WORD) ( (farbcode << 4) |
                               ForeColor) );
    
}


void cursorsichtbar (int code )   // 0=unsichtbar, 1 = sichtbar
{
   HANDLE hConsole;
   BOOL bSuccess;
   CONSOLE_CURSOR_INFO cci;  // enthält dwSize (0-100) und  bVisible
  
   hConsole = holeoutput ();
   bSuccess = GetConsoleCursorInfo( hConsole, &cci );

   cci.bVisible = code;

   SetConsoleCursorInfo( hConsole, &cci );

}



void gotoxy ( int spalte, int zeile)
{
   HANDLE hConsole;
   BOOL bSuccess;
   COORD coordScreen ;    /* Schirmkoordinatenstruktur mit   X  Y  */
                                      
   CONSOLE_SCREEN_BUFFER_INFO csbi; /*  buffer info */
  
   hConsole = holeoutput ();
   bSuccess = GetConsoleScreenBufferInfo( hConsole, &csbi );

   spalte = spalte - 1;  // anpassen an 0 bis ..
   if (spalte >= csbi.dwSize.X)  spalte = csbi.dwSize.X - 1 ;
   if (spalte < 0)  spalte = 0 ;
   zeile = zeile - 1;
   if (zeile >= csbi.dwSize.Y)  zeile = csbi.dwSize.Y -1 ;
   if (zeile <0)  zeile = 0;

   coordScreen.X = spalte;
   coordScreen.Y = zeile;
   bSuccess = SetConsoleCursorPosition( hConsole, coordScreen );

}

void delay(int msec)
{        // wartet die angegebenen millisekunden
    long ticks1;
    
    ticks1 = clock();  // clocks liefert Zeit seit Start des Rechners
                        // in der Einheit 1/CLOCKS_PER_SEC   Sekunde
    msec = msec * CLOCKS_PER_SEC / 1000; // anpassen an compilermass

    ticks1 = ticks1 + msec;

    while (ticks1 > clock ());  // haut die Zeit aufwendig tot
    
}

int random (int obergrenze)
{

    static int gestartet = 0;

    if (gestartet == 0 )                    // nur beim 1. Aufruf
    {  
        srand( (unsigned)time( NULL ) );    // starte Zufallszahlenkette
        gestartet = 1;                        // mit laufender Sek-zeit
    }

    if (obergrenze > 0)                        // falls Obergrenze
        return rand() % obergrenze;            // limitiere die Zufallszahl
    else
        return rand ();                        // sonst die ganze retour
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
04.04.2005, 22:38 Uhr
rejo



Habe so über Watch auf MVC++ entdeckt das während der laufzeit eine variable geändert wird ohne irgendwas damit zu machen .. was kann das denn sein ???
Könnt es sein das ich kein Speicher mehr zu verfügung habe oder so und was könnte ich dagegen tun?

adresse / inhalt
0x0012fe44 "$y$;"
0x0012fe90 "ÍÍÍÍÍÍÍÍÍÍÍÍ$y$;"

zusammenhang?

Dieser Post wurde am 04.04.2005 um 22:59 Uhr von rejo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
05.04.2005, 10:51 Uhr
Th



Du hast die NFAtab als char* deklariert. Nun setzt du in der Init-Funktion die Werte immer auf temp. Da dies eine lokale Variable ist, wird diese natürlich immer wieder neu überschrieben.
Du mußt dafür dann dynamisch Speicher allozieren (malloc) und natürlich am Ende des Programms dann wieder freigeben (free).
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
05.04.2005, 16:47 Uhr
rejo



 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: