C Schleifen Abbruch

c0mp4ct

Lieutenant
Registriert
Juli 2008
Beiträge
751
Hallo Leute,

ich habe ein Problem mit einer Abbruchbedingung. Die Schleife wird einfach nicht abgebrochen, obwohl die Abbruchbedingung erfüllt ist.

Code:
char operatorSuche(char zeile[], int z)
{
	char c = '\0' ;
	char op = '\0' ; 	//Operator
	c = zeile[z] ;
	bool end = false ;
	printf("%d false?\n", end) ;
	while (!end)
  	{
    	if (c == '=')
    	{
			printf("= wurde eingegeben\n") ;
			op = '=' ;
			end = true ;
		}
		else if (c == '+')
     	{
			printf("+ wurde eingegeben\n") ;
			op = '+' ;
			end = true ;
		}
		else if (c == '-')
    	{
			printf("- wurde eingegeben\n") ;
			op = '-' ;
			end = true ;
		}
		else if (c == '*')
    	{
			printf("* wurde eingegeben\n") ;
			op = '*' ;
			end = true ;
		}
		else if (c == '/')
    	{
			printf("/ wurde eingegeben\n") ;
			op = '/' ;
			end = true ;
    	}
		else
		{
			if (op == ' ')
    		{
				op = '\0' ;
    		}
		}
		printf("%d true?\n", end) ;
		z++ ;
    	c = zeile[z] ;
  	}
  	return op ;
}

Auf der console gibt er mir

Code:
0 false?
0 true?
/ wurde eingegeben
1 true?
0 false?
0 true?
0 true?
0 true?
...

aus. Eingegeben wurde "a/b-c/d". Die Abbruchbedingung ist doch damit erfüllt?! Wo ist mein Denkfehler? Hoffe ihr könnt mir helfen. Danke schonmal!
 
Hi. Du guckst du mir unbedingt "CASE" unter C an. Weil so wie du das hast ist mal garnicht schön.

PS: Return 0/1 ist was du suchst

Edit: Hier, so programmiert man: http://www.peacesoftware.de/ckurs7.html , alles andere ist unschön bzw. auf einem BWLer lvl :P
 
Zuletzt bearbeitet:
Ich habe den gleich Code auch als Case (das zu der Sache das es besser geht und ich bin btw. kein BWL'er), doch um es leichter zu verstehen habe ich nochmal als if umgebaut. Hier der Code als Case:

Code:
char operatorSuche(char zeile[], int z)
{
  char c = '\0' ;
  char op = '\0' ; 	//Operator
  c = zeile[z] ;
  bool end = false ;
  printf("%d false?\n", end) ;
  while (!end)
  {
    switch (c)
    {
      case '=':
      printf("= wurde eingegeben\n") ;
      op = '=' ;
      end = true ;
      break;
      case '+':
      printf("+ wurde eingegeben\n") ;
      op = '+' ;
      end = true ;
      break;
      case '-':
      printf("- wurde eingegeben\n") ;
      op = '-' ;
      end = true ;
      break;
      case '*':
      printf("* wurde eingegeben\n") ;
      op = '*' ;
      end = true ;
      break;
      case '/':
      printf("/ wurde eingegeben\n") ;
      op = '/' ;
      end = true ;
      break;
    }
    z++ ;
    c = zeile[z] ;
  }
  if (op == ' ')
    {
	  op = '\0' ;
    }
  return op ;
}

@ReVo
was meinst du mit: "Return 0/1 ist was du suchst"?

true = 1 und false = 0 ist mir schon klar, jedoch setzt er mir end immer wieder auf 0. Doch warum?
 
Zuletzt bearbeitet:
ist doch egal, ob man das mit switch/case macht oder ifs.

0 false?
while gestartet
0 true?
/ wurde eingegeben
1 true?
while beendet

da geht er doch einmal durch.

0 false?
while gestartet
0 true?
0 true?
0 true?
...

bei dem durchlauf würde ich sagen, dass einfach keins der gesuchten zeichen im array ist.
allerdings müsste irgendwann ein segmentation fault oder sowas kommen, wenn du übers array hinaus in einen unadressierbaren bereich kommst.

deine abbruchbedingung solltest du anpassen. also:

while (!end || z == (sizeof(zeile) / sizeof(*zeile)))

oder so ähnlich ^^

btw. dein output ist ziemlich seltsam... 0 true 0 false o_O was dachtest denn, wie das dir beim debuggen hilft ^^
 
Zuletzt bearbeitet:
Schnell und schlampig:
Code:
char OperatorSuche(char Zeile[]){
   int i = 0;
   while((Zeile[i] != '+') && (Zeile[i] != '-') && (Zeile[i] != '*') && (Zeile[i] != '/') && (Zeile[i] != '\0')){
      i++;
   }
   printf("%c wurde eingegeben!\n", Zeile[i]); 
   return Zeile[i];
}

Setzt voraus, dass die Zeile nullterminiert ist.

Sollte jemand im obigen Quellcode einen Fehler finden, so verzeihe man es mir, ich bin bei dieser obszönen Hitze kaum noch denkfähig.
 
Zuletzt bearbeitet:
@DonyDepp

Das ist es ja gerade, er soll abbrechen wenn er ein Zeich im String gefunden hat und eben nicht noch weiter durchsuchen (es gab ein segmentation fault ja), doch er durchsucht ja weiter, obwohl die Abbruchbedingunger erfüllt ist.
 
c0mp4ct schrieb:
@DonyDepp

Das ist es ja gerade, er soll abbrechen wenn er ein Zeich im String gefunden hat

das tut er doch?!

0 false?
0 true?
/ wurde eingegeben
1 true?

an dieser stelle hat er die methode mit "return op" verlassen.
aber wahrscheinlich rufst du die methode später nochmal auf?
dann solltest du mal die schleife posten, in der die methode aufgerufen wird.

0 false?

false gibt er nur VOR der whileschleife aus :P
 
Zuletzt bearbeitet:
Da lag der Fehler, in der Schleife die sie aufruft :( ach man. Es ist eindeutig zu warm zum Klardenken. Vielen Dank für die Hilfe und @Der Alu für die schöne Version von meinem Code :)
 
Zurück
Oben