C Wieso kein eingegebener char bei if-Abfrage verwendbar?

AP Nova

Commander
Registriert
Juni 2008
Beiträge
2.256
Ich würde gerne in einem Programm die Möglichkeit bieten, mittendrin zu beenden (ging natürlich auch über das x rechts oben am Fenster, aber trotzdem hätte ich gerne eine Lösung im Programm selbst). Dazu hatte ich folgenden Code:

scanf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c", &Eingabes[1], &Eingabes[2], &Eingabes[3], &Eingabes[4], &Eingabes[5], &Eingabes[6], &Eingabes[7], &Eingabes[8], &Eingabes[9], &Eingabes[10], &Eingabes[11], &Eingabes[12], &Eingabes[13], &Eingabes[14], &Eingabes[15], &Eingabes[16], &Eingabes[17], &Eingabes[18], &Eingabes[19], &Eingabes[20], &Eingabes[21], &Eingabes[22], &Eingabes[23], &Eingabes[24], &Eingabes[25], &Eingabes[26], &Eingabes[27], &Eingabes[28], &Eingabes[29], &Eingabes[30], &Eingabes[31], &Eingabes[32]);
fflush(stdin);
if(Eingabes[1] == '2')
break;

"Eingabes[]" wurde weiter oben bereits mit "char Eingabes[32];" erzeugt. Ich habe so viele char genommen, da ich bis jetzt nicht dahinter kam, wie ich in C ohne Weiteres Strings benutzen kann. Wenn ich nun allerdings 2 eingebe, wird break; nicht ausgeführt, das selbe Ergebnis, wenn ich die ' entferne, wenn ich bei if Eingabes[1] == 'A' eintrage und dann A eingebe oder "== 65" eintrage und A eingebe. Wenn ich in scanf allerdings einen Integer verwende und diesen in die if-Abfrage einbaue, klappt es ohne Probleme.
Kann mir jemand erklären, wo das Problem mit char und der if-Abfrage liegt und was ich machen muss, damit es funktioniert?
 
bitte überleg dir vorhermal wie man wirklich ordentlich (zumindest halbwegs!) sauber programmiert. dieser code ist ehrlich gesagt zum kotzen. ich hab jetzt zwar nicht gekuckt, was da jetzt das problem genau ist, aber ich denke du wirst auch niemanden finden der da was rauslesen will. so einen verkorksten code kannst du einfach niemanden antun. das musst du sowiso ändern!
sry, is nicht persönlich gemeint. nur meine meinung.
 
hier geht’s ja grob zu! :(

zum einlesen von strings gibt es mehrere Möglichkeiten:


Code:
    char in[512];
    cin>>in;                // Methode 1
    scanf("%s",&in);        // Methode 2
    cin.getline(in,512);    // Methode 3
                            // ...
    cout << in;

Das mit dem Break kann nicht gehen - informier dich mal über den Gebrauch diese Schlüsselwortes. Am einfachsten ist es wohl, wenn du statt break return() schreibst, also die main()-Funktion verlässt und damit auch dein Programm.
 
Zuletzt bearbeitet:
1. Der Code sieht nur wegen den unzäligen "Eingabes[]" so unübersichtlich aus, denn sonst stehen da nur 3 weitere Befehle. Wieso ich so viele char verwende habe ich wohl auch gesagt.

2. Genau genommen geht es mit dem break. Denn ich habe das ganze in einem while, das in einem switch sitzt. Das switch hat insgesamt 7 case, wobei eins lediglich dazu da ist, direkt zu beenden. In 2 davon wird statt char ein integer eingegeben, in diesen klappt break; auch, das while wird verlassen, das jeweilige case kommt an sein eigenes break;, die anderen case werden nicht mehr beachtet, das Programm kommt zu return 0 und dann schließt es sich. Nur wenn ich die if Abfrage mit char mache, geht es nicht.

edit: Hier also mal grob der wesentliche Aufbau:

int main(void)
{
switch
{
case 1: while{
scanff("%i", integervariabel);
if(integervariabel == 0);
break;
}
break; //hier geht das 1. break und führt zum programmende
case 2: while{
scanff("%c", charvariabel);
if(charvariabel == '2');
break;
}
break; //hier geht das 1. break nicht und das Programm läuft einfach weiter
}
return 0;
}
 
Zuletzt bearbeitet:
lösch den Eingabepuffer vor dem scanff("%c%", charvariabel) -

vieleicht hilft das.

PS: du verwendest "&Eingabes[32]" (das 33. Element) - hast aber das Feld mit nur 32 Elementen initialisiert
 
Zuletzt bearbeitet:
fflush(stdin); direkt vor dem scanf funktioniert auch nicht.
 
zeig doch mal den kompletten Code - so ist das etwas schwer zu analysieren
 
Mittlerweile habe ich das break; durch ein goto zum Anfang des Ganzen ersetzt, allerdings sollte das keine Rolle spielen, da es anscheinend an der if Abfrage gescheitert ist.
Gibt es eigentlich einen weg statt goto und dann einem Ziel am Anfang von main direkt main von vorne auszuführen?

Bei case 1 mit dem integer geht es, bei case 2 mit char allerdings nicht. Die darauffolgenden case sind genau so aufgebaut.

Code:
#include <stdio.h>
int main(void)
{
	Sprungmarke : ;
	int Eingabe, Auswahl, Zaehler = 1, Zaehler2 = 1, Zahl = 0, Hexcount = 0;
	char Eingabes[32];
	printf("Wählen Sie aus:\n\
			-1- Eine Dezimalzahl zu einer Binaerzahl umwandeln\n\
			-2- Eine Binaerzahl zu einer Dezimalzahl umwandeln\n\
			-3- Eine Dezimalzahl zu einer Hexadezimalzahl umwandeln\n\
			-4- Eine Hexadezimalzahl zu einer Dezimalzahl umwandeln\n\
			-5- Eine Binaerzahl zu einer Hexadezimalzahl umwandeln\n\
			-6- Eine Hexadezimalzahl zu einer Binaerzahl umwandeln\n\
			-7- Das Programm beenden\n");
	scanf("%i", &Auswahl);
	fflush(stdin);
	switch(Auswahl)
	{
	case 1:
		while(1)
		{
			printf("Geben Sie eine Dezimalzahl ein. (\"0\" fuer Rueckkehr zum Menue, Programm wiederholt sich automatisch)\n");
			scanf("%i", &Eingabe);
			fflush(stdin);
			if(Eingabe == 0)
				goto Sprungmarke;
			while(Zaehler2 < 33)
			{
				(Eingabe&Zaehler) ? printf("1") : printf("0");
				Zaehler *= 2;
				Zaehler2++;
			}
			Zaehler = Zaehler2 = 1;
			printf("\n");
		}
		break;
	case 2:
		while(1)
		{
			printf("Geben sie eine Binaerzahl ein. (\"2\" fuer Rueckkehr zum Menue, Programm wiederholt sich automatisch)(folgende Laenge:)\n00000000000000000000000000000000\n");
			scanf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c", &Eingabes[1], &Eingabes[2], &Eingabes[3], &Eingabes[4], &Eingabes[5], &Eingabes[6], &Eingabes[7], &Eingabes[8], &Eingabes[9], &Eingabes[10], &Eingabes[11], &Eingabes[12], &Eingabes[13], &Eingabes[14], &Eingabes[15], &Eingabes[16], &Eingabes[17], &Eingabes[18], &Eingabes[19], &Eingabes[20], &Eingabes[21], &Eingabes[22], &Eingabes[23], &Eingabes[24], &Eingabes[25], &Eingabes[26], &Eingabes[27], &Eingabes[28], &Eingabes[29], &Eingabes[30], &Eingabes[31], &Eingabes[32]);
			fflush(stdin);
			if(Eingabes[1] == '2')
				goto Sprungmarke;
			while(Zaehler2 < 33)
			{
				if(Eingabes[Zaehler2] == '1')
				{
					Zahl |= Zaehler;
				}
				Zaehler *= 2;
				Zaehler2++;
			}
			printf("%i\n", Zahl);
			Zahl = 0;
			Zaehler = Zaehler2 = 1;
		}
		break;
	case 3:
		while(1)
		{
			printf("Geben Sie eine Dezimalzahl ein. (\"0\" fuer Rueckkehr zum Menue, Programm wiederholt sich automatisch)\n");
			scanf("%i", &Eingabe);
			fflush(stdin);
			if(Eingabe == 0)
				goto Sprungmarke;
			while(Zaehler < 9)
			{
				if(Eingabe == 0)
					break;
				if(Eingabe&Zaehler2)
					Hexcount += 1;
				Zaehler2 *= 2;
				if(Eingabe&Zaehler2)
					Hexcount += 2;
				Zaehler2 *= 2;
				if(Eingabe&Zaehler2)
					Hexcount += 4;
				Zaehler2 *= 2;
				if(Eingabe&Zaehler2)
					Hexcount += 8;
				Zaehler2 *= 2;
				switch(Hexcount)
				{
					case 0: printf("0");
						break;
					case 1: printf("1");
						break;
					case 2: printf("2");
						break;
					case 3: printf("3");
						break;
					case 4: printf("4");
						break;
					case 5: printf("5");
						break;
					case 6: printf("6");
						break;
					case 7: printf("7");
						break;
					case 8: printf("8");
						break;
					case 9: printf("9");
						break;
					case 10: printf("A");
						break;
					case 11: printf("B");
						break;
					case 12: printf("C");
						break;
					case 13: printf("D");
						break;
					case 14: printf("E");
						break;
					case 15: printf("F");
						break;
				}
				Hexcount = 0;
				Zaehler++;
			}
			printf("\n");
			Zaehler2 = Zaehler = 1;
		}
		break;
	case 4:
		while(1)
		{
			printf("Geben Sie eine Hexadezimalzahl ein. (\"0\" fuer Rueckkehr zum Menue, Programm wiederholt sich automatisch)(folgende Laenge:)\nFFFFFFFF\n");
			scanf("%c%c%c%c%c%c%c%c", &Eingabes[1], &Eingabes[2], &Eingabes[3], &Eingabes[4], &Eingabes[5], &Eingabes[6], &Eingabes[7], &Eingabes[8]);
			fflush(stdin);
			if(Eingabes[1] == 0)
				goto Sprungmarke;
			while(Zaehler < 9)
			{
				switch(Eingabes[Zaehler])
				{
					case '0': Zahl += 0 * Zaehler2;
						break;
					case '1': Zahl += 1 * Zaehler2;
						break;
					case '2': Zahl += 2 * Zaehler2;
						break;
					case '3': Zahl += 3 * Zaehler2;
						break;
					case '4': Zahl += 4 * Zaehler2;
						break;
					case '5': Zahl += 5 * Zaehler2;

						break;
					case '6': Zahl += 6 * Zaehler2;
						break;
					case '7': Zahl += 7 * Zaehler2;
						break;
					case '8': Zahl += 8 * Zaehler2;
						break;
					case '9': Zahl += 9 * Zaehler2;
						break;
					case 'A': Zahl += 10 * Zaehler2;
						break;
					case 'B': Zahl += 11 * Zaehler2;
						break;
					case 'C': Zahl += 12 * Zaehler2;
						break;
					case 'D': Zahl += 13 * Zaehler2;
						break;
					case 'E': Zahl += 14 * Zaehler2;
						break;
					case 'F': Zahl += 15 * Zaehler2;
						break;
				}
				Zaehler2 *= 16;
				Zaehler++;
			}
			printf("%i\n", Zahl);
			Zaehler = Zaehler2 = 1;
			Zahl = 0;
		}
		break;
	case 5:
		while(1)
		{
			printf("Geben sie eine Binaerzahl ein. (\"2\" fuer Rueckkehr zum Menue, Programm wiederholt sich automatisch)(folgende Laenge:)\n00000000000000000000000000000000\n");
			scanf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c", &Eingabes[1], &Eingabes[2], &Eingabes[3], &Eingabes[4], &Eingabes[5], &Eingabes[6], &Eingabes[7], &Eingabes[8], &Eingabes[9], &Eingabes[10], &Eingabes[11], &Eingabes[12], &Eingabes[13], &Eingabes[14], &Eingabes[15], &Eingabes[16], &Eingabes[17], &Eingabes[18], &Eingabes[19], &Eingabes[20], &Eingabes[21], &Eingabes[22], &Eingabes[23], &Eingabes[24], &Eingabes[25], &Eingabes[26], &Eingabes[27], &Eingabes[28], &Eingabes[29], &Eingabes[30], &Eingabes[31], &Eingabes[32]);
			fflush(stdin);
			if(Eingabes[1] == '2')
				goto Sprungmarke;
			while(Zaehler2 < 33)
			{
				if(Eingabes[Zaehler2]&1)
					Hexcount += 1;
				Zaehler2++;
				if(Eingabes[Zaehler2]&1)
					Hexcount += 2;
				Zaehler2++;
				if(Eingabes[Zaehler2]&1)
					Hexcount += 4;
				Zaehler2++;
				if(Eingabes[Zaehler2]&1)
					Hexcount += 8;
				Zaehler2++;
				switch(Hexcount)
				{
					case 0: printf("0");
						break;
					case 1: printf("1");
						break;
					case 2: printf("2");
						break;
					case 3: printf("3");
						break;
					case 4: printf("4");
						break;
					case 5: printf("5");
						break;
					case 6: printf("6");
						break;
					case 7: printf("7");
						break;
					case 8: printf("8");
						break;
					case 9: printf("9");
						break;
					case 10: printf("A");
						break;
					case 11: printf("B");
						break;
					case 12: printf("C");
						break;
					case 13: printf("D");
						break;
					case 14: printf("E");
						break;
					case 15: printf("F");
						break;
				}
				Hexcount = 0;
			}
			printf("\n");
			Zaehler2 = Zaehler = 1;
		}
		break;
	case 6:
		while(1)
		{
			printf("Geben Sie eine Hexadezimalzahl ein. (\"0\" fuer Rueckkehr zum Menue, Programm wiederholt sich automatisch)(folgende Laenge:)\nFFFFFFFF\n");
			scanf("%c%c%c%c%c%c%c%c", &Eingabes[1], &Eingabes[2], &Eingabes[3], &Eingabes[4], &Eingabes[5], &Eingabes[6], &Eingabes[7], &Eingabes[8]);
			fflush(stdin);
			if(Eingabes[1] == 0)
				goto Sprungmarke;
			while(Zaehler < 9)
			{
				switch(Eingabes[Zaehler])
								{
					case '0': printf("0000");
						break;
					case '1': printf("1000");
						break;
					case '2': printf("0100");
						break;
					case '3': printf("1100");
						break;
					case '4': printf("0010");
						break;
					case '5': printf("1010");
						break;
					case '6': printf("0110");
						break;
					case '7': printf("1110");
						break;
					case '8': printf("0001");
						break;
					case '9': printf("1001");
						break;
					case 'A': printf("0101");
						break;
					case 'B': printf("1101");
						break;
					case 'C': printf("0011");
						break;
					case 'D': printf("1011");
						break;
					case 'E': printf("0111");
						break;
					case 'F': printf("1111");
						break;
				}
				Zaehler++;
			}
			printf("\n");
			Zaehler = 0;
		}
		break;
	case 7:
		break;
	}
	return 0;
}
 
hab mal den Fall 2 abgeändert, so das er läuft:
Code:
	case 2:
		while(1)
		{
			printf("Geben sie eine Binaerzahl ein. (\"2\" fuer Rueckkehr zum Menue, Programm wiederholt sich automatisch)(folgende Laenge:)\n00000000000000000000000000000000\n");
			scanf("%s",Eingabes);
			fflush(stdin);
			if(Eingabes[0] == '2')
				goto Sprungmarke;
			while(Zaehler2 < 32)
			{
				if(Eingabes[Zaehler2] == '1')
				{
					Zahl |= Zaehler;
				}
				Zaehler *= 2;
				Zaehler2++;
			}
			printf("%i\n", Zahl);
			Zahl = 0;
			Zaehler = Zaehler2 = 1;
		}
		break;
 
Danke...

Denke wenn ich mir das noch ein bisschen anschaue werde ich auch verstehen, wie ich selbst die Strings verwenden kann. Habe ich es richtig beobachtet, dass diese mit String[0] anfangen und nicht wie in einem Char-Array mit [1]?
 
das Problem besteht im scanf(). Es verlangt dass du z.B. beim Fall vier mindestens 8 Zeichen eingibst - das erste müsste zu abbrechen dann eine 0 sein.

Habe ich es richtig beobachtet, dass diese mit String[0] anfangen und nicht wie in einem Char-Array mit [1]?
ja - alle arrays fangen bei 0 an
 
Wie kann ich dann, wenn ich "char name[1]" schreibe, wobei ein Array der Größe eins entsteht (oder entsteht in C dabei eins bis zur Adresse 1?) auf name[1] zugreifen, statt nur auf name[0]?

Noch etwas: Wieso muss vor das String in "scanf("%s", Eingabes);" kein &, ich dachte, das wäre ein Zeichen, welches zwangshaft eingesetzt werden muss.
 
Zu deiner Ersten Frage: wenn du ein array der Größe 4 erstellst (char str[4]), dann hat das erste Element die Adresse 0 , das zweite 1 .. das letzte 3. (str[0] ... str[3]).

Noch etwas: Wieso muss vor das String in "scanf("%s", Eingabes);" kein &, ich dachte, das wäre ein Zeichen, welches Zwangshaft eingesetzt werden muss.

Der Compiler wandelt automatisch um. Du kannst genau so gut mit dem Referenzoperator "&" arbeiten. Dann solltest du aber ein Element des Feldes Angeben: &Eingabes[0]

PS: Kann dir nur dringen empfehlen mal ein C/C++ Tutorial durch zulesen.
 
Zuletzt bearbeitet:
hab hir mal ein Vorschlag für den Fall 4:

Code:
	case 4:
		while(1)
		{
			
			char buffer[128];
			printf("Geben Sie eine Hexadezimalzahl ein. (\"0\" fuer Rueckkehr zum Menue, Programm wiederholt sich automatisch)(folgende Laenge:)\nFFFFFFFF\n");
			
			scanf("%s",buffer);
			if(buffer[0] == '0')
				goto Sprungmarke;			
			sscanf(&buffer[0],"%c%c%c%c%c%c%c%c", &Eingabes[1], &Eingabes[2], &Eingabes[3], &Eingabes[4], &Eingabes[5], &Eingabes[6], &Eingabes[7], &Eingabes[8]);
			fflush(stdin);

			while(Zaehler < 8)
			{ ................

das mit den arrays musst du noch ändern.

PS: mir ist im übringen aufgefallen, das die Ergebnise hier nicht richtig sind: 0xF000000 ist nicht 15 !! Überleg mal warum
 
Zuletzt bearbeitet:
Ich bin gerade dran "C von A bis Z" durchzulesen, nur behält man sich beim ersten durchlesen nicht alles, allerdings werde ich es auch nicht jetzt schon ein zweites Mal durchlesen, denn wenn ich jetzt schon einmal grob das folgende kenne, werde ich die Anfänge besser verstehen.

4 bis 6 habe ich jetzt selbständig bereits angepasst, auch den Fehler der durch den Anfang bei [0] statt wie vorher bei [1] eintstand, weshalb immer die 1. Stelle der eingabe einfach "überlesen" wurde. Jetzt klappt alles so wie ich wollte, danke für eure Hilfe!

edit: Falls es interessiert, ich habe einfach immer die %c(...) und entsprechenden charnamen gelöscht, durch %s und "Eingabes" ersetzt und die Zahlen angepasst.
 
Woey schrieb:
PS: mir ist im übringen aufgefallen, das die Ergebnise hier nicht richtig sind: 0xF000000 ist nicht 15 !! Überleg mal warum

Die kleineren Stellen sind hierbei links, da ich bei dem ersten Binärwandler den Fehler gemacht habe, zuerst Bit 1 auszulesen, welches für den Computer anscheinend auch das erste links und nicht das letzte rechts ist, hatte ich dann den Fehler weiterhin fortgesetzt...

Mich persönlich hätte es nicht weiter gestört, da das Programm so ja generell alles "verkehrt" herum ausgegeben hätte, wodurch der Fehler wieder nicht mehr interessiert. Dennoch passe ich den Code gerade an eine umgekehrte Umrechnung an, so weit es geht soll es einfach "perfekt" und auch richtig klappen...
 
Zurück
Oben