Absturzsicherung gegen Eingabefehler

Seeyou

Grünschnabel
Hallo,
viellicht könnt ihr mir helfen. Ich habe (mit einer Vorlage) ein Programm in C geschrieben. Es ist aber nicht absturzsicher gegen Eingabefehler.
Das Programm berechnet die Entfehrnung zwischen sechs Städten, die durch Nummern definiert sind. Wenn man anstelle einer Nummer einen Buchstaben eingibt, stürzt das Programm ab. Kann mir einer helfen? Ich bin nicht sehr fit im programmieren :)

Gruß Seeyou
 
moin


Vor dem benutzen der Benutzereingabe prüfst du einfach ob die eingegeben Zeichen wirklich alles Zhalen sind, wenn nicht wird die Eingabe wiederholt.
Zeig mal was du bis jetzt hast.


mfg
umbrasaxum
 
Also das habe ich bis jetzt:

Code:
 #include <stdio.h>
 #include <stdlib.h> 

 #define  BOOLEAN  int
 #define  TRUE       1
 #define  FALSE      0
       
 #define     N   6
 #define  SLEN  12


 /*  char-ARRAY, indem die Stadt-Namen abgelegt werden !  */

 char stadtnam[ N ][ SLEN ]
                 = {  "Wien",     "Linz",      "Graz",
                      "Salzburg", "Innsbruck", "Klagenfurt" };


 /*  Quadratisches ARRAY enthaelt die konstanten Strecken
     der Entfernungstabelle der  N  Staedte                */

 int e[ N ][ N ] = {
                      {    0, 188, 204, 302, 468, 310 },
                      {  188,   0, 276, 125, 291, 274 },
                      {  204, 276,   0, 278, 444, 152 },
                      {  302, 125, 278,   0, 166, 242 },
                      {  468, 291, 444, 166,   0, 326 },
                      {  310, 274, 152, 242, 326,   0 } 
                    };

 int main( void )
{
  int i, k,n=1, L, m;
  int von, neuvon,ges=0,ag=0,bis, next;
  char abfrage;
  BOOLEAN  ok,eingabe=FALSE, notok ;
 
  printf("\n Programm   < kmTafel >   greift auf eine Entfernungs-");
  printf("\n tabelle in Form einer quadratischen Matrix zu -- hier");
  printf("\n realisiert als zwei-dimensionales ARRAY  --  und gibt");
  printf("\n die einfache Strecke zwischen zwei Staedten innerhalb");
  printf("\n Oesterreichs aus.                                    "); 
  printf("\n Es koennen  alle gegenseitigen Entfernungen der sechs");
  printf("\n nachfolgenden Staedte abgerufen werden:              ");
  printf("\n"); 
  printf("\n");
  printf("\n  Stadt-Nummer:    Name der Stadt:");
  printf("\n  -------------    ---------------");
  for ( i=0; i < N; i++ )
            printf("\n              %d    %s", i, stadtnam[ i ]);
  printf("\n \n");
  printf("\n Entfernungstabelle  -- ist hier eine 6 x 6 -- Matrix ");
  printf("\n ---------------------------------------------------- ");
   for (i = 0; i < N;  i++)

        {  printf("\n");
           for ( k=0; k < N; k++ ) printf(" %5d ", e[ i ][ k ]);
        };
      printf("\n \n");
   do
     {
      printf("\n  Stadt-Nummer:  Name der Stadt:");
      printf("\n  -------------  ---------------");
      for ( i=0; i < N; i++ )
                   printf("\n              %d  %s", i, stadtnam[ i ]);
      
      printf("\n -----------------------------------------------------");
      printf("\n \n");
      printf("\n Geben Sie die Nummer der jeweiligen Stadt ein: ");
      printf("\n \n");
      printf("\n -- Ausgangsort ?  -----> von  [ Stadt-Nr. ] = ");/*Abfrage des Ausgangsortes*/
      scanf("%i", &von); /*Einlesen des Ausgangsortes*/
      printf("\n");
      Zielpunkt: /*Definition für den Sprung zum Zielort*/
      printf("\n ----- Zielort  ?  -----> nach [ Stadt-Nr. ] = ");/*Abfrage des Zielortes*/
      scanf("%i", &bis); /*Einlesen des Zielortes*/
      printf("\n\n");
      if (von==bis) /*Abfrage ob Anfangspunkt auch Zielpunkt ist*/
        {printf("\n Sie befinden sich schon in %s ", stadtnam [von]);
        goto Zielpunkt;
        }
      else
       ok = ((von >= 0) &&  (von <= 5)) &&(von!=bis)&& ((bis >= 0) && (bis <= 5 ));
       notok = !ok;

      if (notok)
         {   printf("\n\n Diese Route kann nicht berechnet werden:");
      	     printf("\n     Geben Sie einen anderen Wert ein!");
	         printf(" \n\n\n\n\n\n ");
         }
     }
     while ( notok );
   printf("\n\n Die Entfernung von   %s    nach  %s",
                		     stadtnam[ von ],  stadtnam[ bis ] );
   
   printf("\n\n betraegt  %3i  km.", e[ von ][ bis ] );
   ag=e[ von ][ bis ];
   anfang: /*Definition für den Sprung zum Anfang*/
   while (eingabe==FALSE)
   {printf("\n\n --------------------------------------------------");
    printf("\n Wollen sie ihre Reise fortsetzen?(j/n) ? ");
    scanf("%s", &abfrage);
   if ((abfrage=='J')||(abfrage=='j')||(abfrage=='n')||(abfrage=='N'))
      eingabe = TRUE;}
       eingabe=FALSE;
        if ((abfrage=='n')||(abfrage=='N'))
        goto  Schluss; 
        printf("\n  Stadt-Nummer:  Name der Stadt:");
        printf("\n  -------------  ---------------");
        for ( i=0; i < N; i++ )
                   printf("\n              %d  %s", i, stadtnam[ i ]);
                   
  while ((abfrage=='J')||(abfrage=='j'))
        {
        n++;
        neuvon=bis;
 neueingabe:
             printf("\n\n----- Zielort  ?  -----> nach [ Stadt-Nr. ] = ");
             scanf("%i", &bis); 
             printf("\n\n");

    ok = ((von >= 0) &&  (von <= 5))&&(neuvon!=bis) && ((bis >= 0) && (bis <= 5 ));
    notok = !ok;

    if (notok)
     {   printf("\n\n Diese Route kann nicht berechnet werden:");
      	 printf("\n     Geben Sie einen anderen Wert ein!");
	     printf(" \n\n\n\n ");
	     printf("\n  Stadt-Nummer:  Name der Stadt:");
      printf("\n  -------------  ---------------");
      for ( i=0; i < N; i++ )
                   printf("\n              %d  %s", i, stadtnam[ i ]);
         goto neueingabe;   
     };
   while ( notok );
   printf("\n\n Die Entfernung von   %s    nach  %s",
                		     stadtnam[ neuvon ],  stadtnam[ bis ] );

   printf("\n\n betraegt  %3i  km.", e[ neuvon ][ bis ] );
    printf("\n\n --------------------------------------------------");
   ges= ges +e[ neuvon ][ bis ];/*Berechnung für n-Etappen*/
   printf("\n\n --------------------------------------------------");
goto anfang;
 } Schluss: /*Defintion für den Sprung zum Schluss*/
   printf("\n\n Sie haben  %3i  km zurueckgelegt.", ges+ag );
   printf("\n\n   Sie sind %i Etappen gefahren",n);
   if (von==bis)
   printf("\n\n\n  Sie haben eine Rundreise gemacht !");
   printf("\n\n   Sie sind von %s nach %s gefahren",stadtnam[von],stadtnam[bis]);
   printf("\n\n\n Wir danken Ihnen fuer die Benutzung");
   printf("\n unseres Info-Systems !");
   printf("\n \n \n");
   system("PAUSE");
   return 0;
}

Gruß Seeyou
 
moin


Code:
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>


int main( )
{
	char temp[2];
	char eingabe[100];
	int von = 0;

	temp[1] = '\0';
	eingabe[0] = '\0';

	while((temp[0] = getch()) != 13)
	{
		if(temp[0] >= '0' && temp[0] <= '9')
		{
			printf("%c", temp[0]);
			strcat(eingabe, temp);
		}
	}

	von = atoi(eingabe);


	return 0;
}
Der Code lässt nur Zahlen zu, am Ende steht dann in von (so heisst deine Variable auch) die Zahl. So sind Fehler ausgeschlossen.


mfg
umbrasaxum
 
Sorry, wenn ich so doof frage, aber wo muss ich das, was du in deiner Antwort als Code geschrieben hast, einfügen :confused:

Gruß Seeyou
 
moin


Wie hast du den von dir eben geposteten Code hingekriegt, wenn du so etwas simples nciht beherscht?


mfg
umbrasaxum
 
Seeyou hat gesagt.:
Sorry, wenn ich so doof frage, aber wo muss ich das, was du in deiner Antwort als Code geschrieben hast, einfügen :confused:

Gruß Seeyou

Du mußt ihn dort eintragen wo der User in deinem Programm die Zahl eingeben muss . (natürlich entsprechend die Variablennamen ändern)
 
moin


Na das ist ja mal ne ausführliche Vorlage!

Na dann hier einfach mal der Code, allerdings nur reingepackt ohne irgenwas zu optimieren oder großartig anzupassen, aber laufen tut es.
Code:
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>

#define  BOOLEAN  int
#define  TRUE       1
#define  FALSE      0

#define     N   6
#define  SLEN  12


/*  char-ARRAY, indem die Stadt-Namen abgelegt werden !  */

char stadtnam[ N ][ SLEN ]
= {  "Wien",     "Linz",      "Graz",
"Salzburg", "Innsbruck", "Klagenfurt" };


/*  Quadratisches ARRAY enthaelt die konstanten Strecken
der Entfernungstabelle der  N  Staedte                */

int e[ N ][ N ] = {
	{    0, 188, 204, 302, 468, 310 },
	{  188,   0, 276, 125, 291, 274 },
	{  204, 276,   0, 278, 444, 152 },
	{  302, 125, 278,   0, 166, 242 },
	{  468, 291, 444, 166,   0, 326 },
	{  310, 274, 152, 242, 326,   0 } 
};

int main( void )
{
	int i, k,n=1, L, m;
	int von, neuvon,ges=0,ag=0,bis, next;
	char abfrage;
	char temp[2];
	char tempeingabe[10];
	BOOLEAN  ok,eingabe=FALSE, notok ;

	printf("\n Programm   < kmTafel >   greift auf eine Entfernungs-");
	printf("\n tabelle in Form einer quadratischen Matrix zu -- hier");
	printf("\n realisiert als zwei-dimensionales ARRAY  --  und gibt");
	printf("\n die einfache Strecke zwischen zwei Staedten innerhalb");
	printf("\n Oesterreichs aus.                                    "); 
	printf("\n Es koennen  alle gegenseitigen Entfernungen der sechs");
	printf("\n nachfolgenden Staedte abgerufen werden:              ");
	printf("\n"); 
	printf("\n");
	printf("\n  Stadt-Nummer:    Name der Stadt:");
	printf("\n  -------------    ---------------");
	for ( i=0; i < N; i++ )
		printf("\n              %d    %s", i, stadtnam[ i ]);
	printf("\n \n");
	printf("\n Entfernungstabelle  -- ist hier eine 6 x 6 -- Matrix ");
	printf("\n ---------------------------------------------------- ");
	for (i = 0; i < N;  i++)

	{  printf("\n");
	for ( k=0; k < N; k++ ) printf(" %5d ", e[ i ][ k ]);
	};
	printf("\n \n");
	do
	{
		printf("\n  Stadt-Nummer:  Name der Stadt:");
		printf("\n  -------------  ---------------");
		for ( i=0; i < N; i++ )
			printf("\n              %d  %s", i, stadtnam[ i ]);

		printf("\n -----------------------------------------------------");
		printf("\n \n");
		printf("\n Geben Sie die Nummer der jeweiligen Stadt ein: ");
		printf("\n \n");
		printf("\n -- Ausgangsort ?  -----> von  [ Stadt-Nr. ] = ");/*Abfrage des Ausgangsortes*/

		temp[1] = '\0';
		tempeingabe[0] = '\0';

		while((temp[0] = getch()) != 13)
		{
			if(temp[0] >= '0' && temp[0] <= '9')
			{
				printf("%c", temp[0]);
				strcat(tempeingabe, temp);
			}
		}
		temp[0] = '\0';
		von = atoi(tempeingabe);

		printf("\n");
Zielpunkt: /*Definition für den Sprung zum Zielort*/
		printf("\n ----- Zielort  ?  -----> nach [ Stadt-Nr. ] = ");/*Abfrage des Zielortes*/

		temp[1] = '\0';
		tempeingabe[0] = '\0';

		while((temp[0] = getch()) != 13)
		{
			if(temp[0] >= '0' && temp[0] <= '9')
			{
				printf("%c", temp[0]);
				strcat(tempeingabe, temp);
			}
		}
		temp[0] = '\0';
		bis = atoi(tempeingabe);

		printf("\n\n");
		if (von==bis) /*Abfrage ob Anfangspunkt auch Zielpunkt ist*/
		{printf("\n Sie befinden sich schon in %s ", stadtnam [von]);
		goto Zielpunkt;
		}
		else
			ok = ((von >= 0) &&  (von <= 5)) &&(von!=bis)&& ((bis >= 0) && (bis <= 5 ));
		notok = !ok;

		if (notok)
		{   printf("\n\n Diese Route kann nicht berechnet werden:");
		printf("\n     Geben Sie einen anderen Wert ein!");
		printf(" \n\n\n\n\n\n ");
		}
	}
	while ( notok );
	printf("\n\n Die Entfernung von   %s    nach  %s",
		stadtnam[ von ],  stadtnam[ bis ] );

	printf("\n\n betraegt  %3i  km.", e[ von ][ bis ] );
	ag=e[ von ][ bis ];
anfang: /*Definition für den Sprung zum Anfang*/
	while (eingabe==FALSE)
	{printf("\n\n --------------------------------------------------");
	printf("\n Wollen sie ihre Reise fortsetzen?(j/n) ? ");
	scanf("%s", &abfrage);
	if ((abfrage=='J')||(abfrage=='j')||(abfrage=='n')||(abfrage=='N'))
		eingabe = TRUE;}
	eingabe=FALSE;
	if ((abfrage=='n')||(abfrage=='N'))
		goto  Schluss; 
	printf("\n  Stadt-Nummer:  Name der Stadt:");
	printf("\n  -------------  ---------------");
	for ( i=0; i < N; i++ )
		printf("\n              %d  %s", i, stadtnam[ i ]);

	while ((abfrage=='J')||(abfrage=='j'))
	{
		n++;
		neuvon=bis;
neueingabe:
		printf("\n\n----- Zielort  ?  -----> nach [ Stadt-Nr. ] = ");
		scanf("%i", &bis); 
		printf("\n\n");

		ok = ((von >= 0) &&  (von <= 5))&&(neuvon!=bis) && ((bis >= 0) && (bis <= 5 ));
		notok = !ok;

		if (notok)
		{   printf("\n\n Diese Route kann nicht berechnet werden:");
		printf("\n     Geben Sie einen anderen Wert ein!");
		printf(" \n\n\n\n ");
		printf("\n  Stadt-Nummer:  Name der Stadt:");
		printf("\n  -------------  ---------------");
		for ( i=0; i < N; i++ )
			printf("\n              %d  %s", i, stadtnam[ i ]);
		goto neueingabe;   
		};
		while ( notok );
		printf("\n\n Die Entfernung von   %s    nach  %s",
			stadtnam[ neuvon ],  stadtnam[ bis ] );

		printf("\n\n betraegt  %3i  km.", e[ neuvon ][ bis ] );
		printf("\n\n --------------------------------------------------");
		ges= ges +e[ neuvon ][ bis ];/*Berechnung für n-Etappen*/
		printf("\n\n --------------------------------------------------");
		goto anfang;
	} Schluss: /*Defintion für den Sprung zum Schluss*/
	printf("\n\n Sie haben  %3i  km zurueckgelegt.", ges+ag );
	printf("\n\n   Sie sind %i Etappen gefahren",n);
	if (von==bis)
		printf("\n\n\n  Sie haben eine Rundreise gemacht !");
	printf("\n\n   Sie sind von %s nach %s gefahren",stadtnam[von],stadtnam[bis]);
	printf("\n\n\n Wir danken Ihnen fuer die Benutzung");
	printf("\n unseres Info-Systems !");
	printf("\n \n \n");
	system("PAUSE");
	return 0;
}

Übringens sollte man nioemals goto verwenden.
Und Blöcke wie z.B.:
Code:
if(temp .....)
{
    a = b;
}
müssen nicht mit einem Semikolon abgeschlossen werden!


mfg
umbrasaxum
 
Zurück