C - Wie Eingabe von einer natürlichen Zahl überprüfen?

SKu

Fleet Admiral
Registriert
Aug. 2012
Beiträge
11.357
Hallo,

mir fällt das Programmieren nicht leicht. Meine Aufgabe war es ein Programm zu schreiben, dass drei Zahleneingaben entgegennimmt und dann die größte Zahl dabei ausgibt. Das habe ich auch hinbekommen, nur eben funktioniert das Programm nicht, wenn ich Dezimalzahlen oder Buchstaben eingebe. Eigentlich sollte er dann wieder erneut abfragen. So sieht das Programm bisher aus:
Code:
#include <stdio.h>

int main(){
	
	printf("\nBitte geben Sie eine natuerliche Zahl ein.\n\n");
		int z1;
		scanf("%i",&z1);
		
		
			if(z1 >= 0){
				
			}else{
			
				while(z1 < 0){
					
				printf("\nBitte geben Sie eine natuerliche Zahl ein.\n\n");
				scanf("%i",&z1);
			}
				
			}
	
	printf("\nBitte geben Sie eine zweite natuerliche Zahl ein.\n\n");	
		int z2;
		scanf("%i",&z2);
		
			if(z2 >= 0){
				
			}else{
				
				while(z2 < 0){

				printf("\nBitte geben Sie eine natuerliche Zahl ein.\n\n");
				scanf("%i",&z2);
			}
			}
	printf("\nBitte geben Sie eine dritte natuerliche Zahl ein.\n\n");	
		int z3;
		scanf("%i",&z3);
		
			if(z3 >= 0){
				printf("\nIhre Eingaben waren in Ordnung.\n\n");
			}else{
				while (z3 < 0){
				
				printf("\nBitte geben Sie eine natuerliche Zahl ein.\n\n");
				scanf("%i",&z3);
			}
			}
			
			
			if(z1 > z2){
				if(z1 > z3){
					printf("\nDie groesste Zahl ist %i\n\n",z1);
				}else{
					printf("\nDie groesste Zahl ist %i\n\n",z3);
						
				}
				
			}else{
				if(z2 > z3){
					printf("\nDie groesste Zahl ist %i\n\n",z2);
				}else{
					printf("\nDie groesste Zahl ist %i\n\n",z3);
				}
			}	
			
		
		system("pause");
}

Was müsste man jetzt noch einfügen, damit er eben nur natürliche Zahlen annimmt?
 
Zuletzt bearbeitet:
C ist da ein wenig sperrig wenns um so dringe geht.

Man könnte die Eingabe erstmal als Char-Array ("String") speichern, prüfen ob es den ASCII Code für eine Zahl enthält und dann als int speichern.
 
Zuletzt bearbeitet:
Da ich mich selbst damit nicht auskenne, eher interessehalber: Ein Integer kann doch nie etwas anderes sein als eine natürliche Zahl...
 
Negative Zahlen nimmt er ja nicht an, da sie ausgeschlossen sind.

Das Problem ist nur, dass er Buchstaben und Dezimalzahlen annimmt und das Programm dann einfach sofort eine 1 ausgibt. :D
 
Das wichtigste beim programmieren lernen ist, dass man lernt sein Problem zu googeln.

zu "C prüfen ob zahl" findet man duzente Tutorials und Foreneinträge. Da einfach mal durchschauen.

Wie gesagt: C ist da ein wenig sperrig, weil es keine Strings kennt.
 
Die < > 0 prüfung solltest du dir aber mit %u für unsigned sparen können. Es kann sein, dass du Zahlen mit Komma über den Rückgabewert von scanf erkennen kannst. Das müsste man mal in der Spezifikation im Detail nachsehen.

Das Problem mit den Buchstaben dürfte sein, dass diese intern als Zahlen repräsentiert werden.
Ich weiß nicht ob es in ANSI C eine schönere eingebaute Lösung gibt, aber eine Möglichkeit wäre das ganze als String einzulesen und selbst zu parsen ob die einzelnen Zeichen im gültigen Bereich sind, bevor du es zu einem Integer wandelst.

ANSI C ist nicht gerade komfortabel was solche Dinge betrifft und erfordert viel Wissen, Nachlesen und Mitdenken um subtile Fehler zu vermeiden.
Da ich es schon einige Zeit nicht gebraucht habe, erhebe ich vorsichtshalber keinen Anspruch auf Korrektheit, Aktualität und Vollständigkeit meiner Aussagen.

P.S.
Und die Vorsicht hat sich bestätigt. %u akzeptiert in Wirklichkeit auch negative Werte, insofern ist es also gut diese manuell zu prüfen.
In meinem Test mit GCC 4.8.2 wurden auch keine Zeichen als Integer angenommen, und Fließkommazahlen nach dem Punkt abgeschnitten.
Allerdings erinnere ich mich daran, dass zumindest ersteres früher (so 2002-2004) nicht so war, und das Verhalten wird somit compilerspezifisch sein.
 
Zuletzt bearbeitet:
mit GCC 4.8.2 wurden auch keine Zeichen als Integer angenommen

scheint dann compilerspezifisch zu sein. Mit tcc 0.9.25 hört scanf nach einem Enter oder space noch nicht auf.
Dass Kommazahlen abgeschnitten werden, liegt aber auch allein schon daran, dass scanf den eingegebenen String von vorne durchgeht, erste integer bei "1.3" ist eine eins, folglich wird ein "scanf("%i", &zahl)" auch eine 1 einlesen (der Punkt ist kein gültiges Zeichen in einem Integer.) Analog verhält es sich bei Brüchen, während bei Buchstaben oder sonstiger ungültiger Eingabe der Wert von zahl unberührt bleibt, da dort oben nicht initialisiert wird, steht also einfach irgendwas drin.
 
Ein möglicher Weg ist, eine Zeichenkette in eine Zahl umzuwandeln und über die Länge der Zeichenkette die Gültigkeit der Zahl prüfen.

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

int main(){
    int z, i, n=1, sl, pruef, max=0;
    char s[9];
    do {
        do {
           printf("\nBitte geben Sie die %1d. natuerliche Zahl ein (1 - 999999999) : ",n);
           scanf("%s",s);
           sl=strlen(s);
           z=atoi(s);
           pruef=1;
           for (i=1; i<sl; i++){
               pruef=pruef*10;
           }
           printf("\nEingabe     : %s\nZAHL        : %d\nSTRINGLAENGE: %d\nPRUEF       : %d\n", s, z, sl, pruef);
        } while ((z < pruef) || (sl > 9));
        
        n++;
        if ( z > max ){
             max=z;
        }
   } while ( n<4 );
   printf("Die größte Zahl ist %d\n",max);
   return 0;
}
Ergänzung ()

Eine andere Lösung führt über den Vergleich des eingegebenen Strings mit dem durch atoi() und sprintf() umgewandelten Zahlenstring:
Code:
.
.
        do {
           printf("\nBitte geben Sie die %1d. natuerliche Zahl ein (1 - 999999999) : ",n);
           scanf("%s",s);
           sl=strlen(s);
           z=atoi(s);
           sprintf(sz,"%d",z);
           printf("\nEingabe     : %s\nZAHL        : %d\nPRUEFZAHL: %s\n", s, z, sz);
           ret = strcmp(s,sz);


        } while (( ret !=0 ) || (sl > 9));
.
.
 
Zuletzt bearbeitet:

Ähnliche Themen

Zurück
Oben