2016-05-09 14 views
-1

Wenn ich diesen Code in Visual Studio 2015 kompiliere, zeigt es einen Fehler als "nicht initialisierte lokale Variable'c 'verwendet". aber es kompiliert gut in anderen ides wie Codeblöcke. Warum bekomme ich diesen Fehler im Visual Studio?Fehler in Visual Studio erhalten

#include<stdio.h> 

    int main() 
    { 
     int x = 1, y = 0; 
     while (x > 0) 
     { 
      char c; 
      if (c!= '\n') 

      printf("do you want to continue the adder (y/n)\n"); 
      scanf_s("%c", &c); 

      if (c == 'y') 
      { 
       int n; 
       printf("enter the number\n"); 
       scanf_s("%i", &n); 
       y += n; 
      } 
      else if (c == 'n') 
       printf("the total count is %i\nadder exited\n", y); 
      else if (c != 'y' && c != 'n') 
       printf("wrong input\n"); 

     } 
     return 0; 
    } 
+0

Sie erhalten keinen Fehler: Dies gibt eine * Warnung *. In anderen Compilern ist jedoch möglicherweise nicht die gesamte Warnstufe festgelegt. Bitte konsultieren Sie das Handbuch des Compilers: Wie man Warnungen aktiviert. –

+0

Ihr Code ruft bei jedem Compiler undefiniertes Verhalten auf. Nur weil Sie keine Warnungen oder Fehler erhalten, heißt das nicht, dass es korrekt ist. Und IDEs kompilieren nicht! Compiler kompilieren. – Olaf

Antwort

2

Das Problem ist in

char c; 
if (c!= '\n') 

für einen unitialized lokalen Variable, der Anfangswert unbestimmt ist und diesen Wert ruft undefined behavior verwenden. Compiler ist sehr richtig zu warnen (Hinweis) Sie.

Sie können die Definition von c außerhalb der Schleife bewegen und initialisieren es wie

char c = 0; 

Hinweis: Idealerweise Compiler soll warnen Sie, aber dann, wenn Sie den Compiler bitten, Behandeln Sie die Warnungen als Fehler (was in der Regel eine gute Übung ist), dann wird der Fehler ausgelöst.

+0

Ich entfernte die Zeile "if (c! = '\ N')" und nach dem Kompilieren des Codes bekomme ich diese Aussage "Willst du den Addierer (y/n) fortsetzen" zweimal in der Ausgabe. Was soll ich ändern oder hinzufügen um es nur einmal in der Ausgabe zu bekommen? –

+0

@sheethu_cool Ich bin nicht sehr vertraut mit 'scanf_s()' Familie, aber es kann mit der abschließenden Zeilenumbruch in der Standardeingabe gespeichert werden. Haben Sie versucht, 'scanf_s ("% c ", &c);' –

+0

ja 'scanf_s() 'speichert die Eingabetaste als Eingabepuffer. Also habe ich' fflush (stdin) 'in der While-Schleife verwendet und das gewünschte Ergebnis erhalten. Danke für die help –

0

Entfernen Sie die Zeile, die if (c != '\n') enthält. Visual Studio generiert eine Warnung korrekt, da Sie auf einen nicht initialisierten Wert bedingt springen. Nach dem Leerzeichen zu urteilen, ist diese Zeile ein Rest des vorherigen Codes.

+0

Die Variable 'c' sollte initialisiert werden, der if-Block muss jedoch nicht entfernt werden es sollte begrenzt sein (mit '{' und '}'). – Frecklefoot

+1

@Frecklefoot - Die Zeile ist unnötig und fehlerhaft in der Programmlogik, und 'c' muss nicht initialisiert werden, wenn sie durch die' scanf' Anweisung zugewiesen wird. (Was es ist) – owacoder