[C] String-Prüfung

MastaZulu

Ensign
Registriert
Aug. 2002
Beiträge
207
Hi!
Hab folgendes Problem:
Ich bin dabei, das Hornerschema für Oktal->Dezimal zu programmieren, was auch einwandfrei funktioniert:

Code:
#include <stdio.h>

void main(void)
  {
	long dezimalzahl = 0;
	int stelle = 0;
	char oktal[12] = {0};
	

	printf("Geben Sie eine Oktalzahl ein: ");
	scanf("%11s", &oktal);
	
	for (stelle = 0 ; oktal[stelle] ; ++stelle ) 
		dezimalzahl = 8 * dezimalzahl + (oktal[stelle] - '0');
	printf("\nDie oktale Zahl %o entspricht %ld im Dezimalsystem.\n\n", dezimalzahl, dezimalzahl);
  }
so, nun möchte ich noch eine Prüfung der Eingabe machen, d.h. das Programm soll nur ausgeführt werden, wenn der Benutzer Oktalzahlen eingegeben hat (0-7). Wenn Zahlen >7 oder Buchstaben vorkommen, soll er eine Fehlermeldung ausspucken.
ausserdem hab ich noch ein Problem was das Ergebnis betrifft. Wie zu sehen ist, gebe ich den ursprünglichen Oktalwert mit %o aus (was das ganze Programm natürlich um einiges vereinfacht hätte, aber es geht ja um die Rechnung). Wie kann ich ihn aber ohne %o, also als String ausgeben?

Danke im Voraus

MastaZulu
 
geht mit ner ganz einfachen if-anweisung
 
hab ich auch gedacht, aber der prüft dann eben nur an der x-ten stelle, also entweder der ersten oder eben an der, die ich ihm vorher zugewiesen hab... wenn man jetzt aber z.b. 214bx3 eingibt, führt er das programm trotzdem aus
 
Folgendes sollte funktionieren.

Code:
#include <stdio.h>

int main(void)
  {
	long dezimalzahl = 0;
	int stelle = 0;
	int failed = 0;
	char oktal[12] = {0};
	

	printf("Geben Sie eine Oktalzahl ein: ");
	scanf("%11s", &oktal);
	
	for (stelle = 0 ; oktal[stelle] ; ++stelle ) {
		if( oktal[stelle] >= '0' && oktal[stelle] <= '7') {
			dezimalzahl = 8 * dezimalzahl + (oktal[stelle] - '0');
                }
		else {
			failed = 1;
			break;
		}
	}
	if( failed) {
		printf("\nFehlerhafte Eingabe\n\n");
	}
	else {
		printf("\nDie oktale Zahl %o entspricht %ld im Dezimalsystem.\n\n", dezimalzahl, dezimalzahl);
	}
	return 0;
  }

P.S. : Es heißt übrigens int main, nicht void main.
 
Du musst die Zahl wieder in vielfache von 8 zerlegen. Im Prinzip tust du etwas in der Art:

Code:
int dezimal = 12345678
char digit = 0;

while( dezimal != 0) {
   digit = (dezimal % 8) + '0';
   dezimal = dezimal / 8;

   /* hier digit auswerten */
}

digit enthält dabei dann die Ziffern der Zahl von rechts nach links. Musst du nur noch in ein char-Array füttern uns ausgeben.
 
hab jetzt das komplette programm soweit fertig, zusammengefügt und es läuft, BIS auf folgendes:
er bringt nach der zusammenfügung wieder bei oktal->dezimal (AUSWAHL == 2) total falsche werte... schön langsam regts mich auf und der prof .... eieiei...

Code:
#include <stdio.h>
#include <conio.h>
#include <limits.h>

void main(void)
  {
	long dezimalzahl, ausgangswert, zwischenwert;
	int auswahl, stelle=10, fehler = 0, schleife = 1, pruefung;
	char oktal[12]={0};
	
	while (schleife == 1)	
	  {
		
		
		printf("*************Auswahl-Menue*************\n"
			    "*                                     *\n"
			    "*  1) Konvertierung Dezimal -> Oktal  *\n"
			    "*  2) Konvertierung Oktal -> Dezimal  *\n"
			    "*  3) Abbruch                         *\n"
			    "*                                     *\n"
			    "***************************************\n");
		printf("Waehlen Sie: ");
		scanf("%d", &auswahl);
		
		if (auswahl == 1)	
		  {	
			oktal[11]='\0';
			stelle = 10;
			
			printf("Geben Sie eine positive ganze Zahl ein: ");
			pruefung = (scanf("%ld", &zwischenwert));
   
			
			if (pruefung == 1)
			  {	
				if (zwischenwert >= 0 && zwischenwert <= LONG_MAX)
				  {
					ausgangswert = zwischenwert;
					while (zwischenwert != 0)
					  {
						dezimalzahl = zwischenwert;
						zwischenwert = zwischenwert / 8;
						dezimalzahl = dezimalzahl % 8;
						oktal[stelle] = dezimalzahl + '0';
						stelle--;
					  }
						printf("\n%ld dezimal entspricht im Oktalsystem der Zahl %s\n\n", ausgangswert, &oktal[stelle+1]);
				  }
				else printf("\nDie eingegebene Zahl ist zu gross!\n\n");
			  }
			else printf("\nSie haben Buchstaben eingegeben, geben Sie Zahlen ein!\n\n"); 
		  }

		else if (auswahl == 2)
		  {
			printf("Geben Sie eine Oktalzahl ein: ");
			scanf("%11s", &oktal);
			
			
			for (stelle = 0 ; oktal[stelle] ; ++stelle ) 
			  {
				if (oktal[stelle] >= '0' && oktal[stelle] <= '7')
					dezimalzahl = 8 * dezimalzahl + (oktal[stelle] - '0');
				else fehler = 1;
			  }
			if (fehler == 1)
				printf("\nFehlerhafte Eingabe! Eine Oktalzahl besteht aus den Ziffern 0-7!\n");
			else printf("\nDie oktale Zahl %o entspricht %ld im Dezimalsystem.\n\n", dezimalzahl, dezimalzahl);
		  }

		else if (auswahl == 3) schleife=0;
		
		else printf("\nFalsche Eingabe. Versuchen Sie es erneut.\n\n");
	  }
  }
und zwecks der rückumwandlung:
ich wills ja nich komplett wieder zurückwandeln, geht es nicht, dass ich einfach einer neuen variablen den wert des eingegebenen strings zukommen lasse? wenn ja, wie?
 
Zuletzt bearbeitet:
ersten benutz zur auswahl der drei optionen, bitte eine switch-anweisung. das problem ensteht auf grund des einlese vorgangs. c schreibt dir den speicher deines strings nur so weit voll, wie es buchstaben kriegt. dann kommt 0x00 dran und der rest des speichers ist undefiniert.
bei deiner rücktransformations musst du das beachten. funktionieren müsstes, wenn du 'stelle' nachdem einlesen auf stelle=length(oktal)-1; setzt.
bei deiner variante erzeugst du an der stelle, wo das stop-byte sitz sowas hier: dezimalzahl=8*dezimalzahl - '0'; und das willst du nicht.
(hab das jetzt nicht ausprobiert, aber müsste so klappen.)
 
schön langsam dreh ich echt durch... der überlauf test bei (Auswahl == 1) funktioniert auch nicht richtig...
auf die lösung des unter (auswahl == 2) bekannten fehlers bin ich auch noch nicht gekommen
 
Zuletzt bearbeitet:
Zurück
Oben