2017-01-21 7 views
1

ich kann nicht herausfinden, warum ich diesen Compiler Fehler. Ich habe i in der for-Schleife deklariert, aber meine Steueranweisung sieht es nicht.Fehler: ‚i‘ nicht deklariert (erste Benutzung in dieser Funktion)

Der Fehler auftritt, auf dieser Linie: if (mystring[cmd_index][i] == '\\')

/* 
* Check for the " character in the mystring 
* and remove the character if it doesn't have the delimiter 
*/ 
for (int i = 0; i < strlen(mystring[cmd_index]); i++) { 
    if (mystring[cmd_index][i] == '\\') { 
     i++; 
    } else 
    if (mystring[cmd_index][i] == '"') { 
     printf("HELLO"); 

     if (i != strlen(mystring[cmd_index] - 1)) { 
      shiftLeft(mystring[cmd_index], i + 1, 1); 
     } else { 
      mystring[cmd_index][i] = '\0'; 
     } 
    } 
} 

Edit1: Ich bin mit gcc Version 5.4.0

Edit2: Ich habe den gleichen Code kopiert und eingefügt es direkt unter dem Original. Dann hat das Original auskommentiert. Es kompiliert jetzt. Aber wenn ich dies rückgängig mache und den ursprünglichen Code verwende, wird es nicht erneut kompiliert. Warum??

+0

Welche Compiler und Version von C verwenden Sie? – babon

+4

Ich nehme an, Sie verwenden 'i' nach der Schleife, wo es nicht definiert ist. Bitte poste einen MCVE ([MCVE]) und die Fehlermeldung mit Zeilennummer. –

+0

Deklarieren 'int i;' vor der for-Schleife und ändern die for-Schleife in 'für (i = 0; i hmofrad

Antwort

0

Ich denke, der Hauptgrund, dass Sie dieses seltsame Problem haben können, ist, dass Sie auch in Ihrem i for-Schleife ändern. Ich überspringe diese Inkremente unter Verwendung von continue;, damit die For-Schleife konsistent ist. Der folgende Code versucht, entfernen Sie die doppelten Anführungszeichen und die Vorwärts bewahren schlitzt, wie ich aus verstehe Ihre Frage.

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

int main(int argc, char* argv[]) 
{ 
    char mystring[3][10]; 
    memset(mystring, '\0', sizeof(mystring)); 

    memcpy(mystring[0], "He\\l\"lo\"", sizeof(mystring[0])); 
    memcpy(mystring[1], "cr\\u\"el\"", sizeof(mystring[1])); 
    memcpy(mystring[2], "wo\\r\"ld\"", sizeof(mystring[2])); 

    int i; 
    int j; 
    int k; 

    for(j = 0; j < 3; j++) 
    { 
     printf("Before: %s\n", mystring[j]); 
     for(i = 0; i < strlen(mystring[j]); i++) 
     { 
      if(mystring[j][i] == '\\') // Skip Backward slashes 
       continue; 
      else if(mystring[j][i] == '"') // Remove double quotes 
      { 
       for(k = i; k < strlen(mystring[j]); k++) 
        mystring[j][k] = mystring[j][k+1]; 
      } 
     } 
     printf("After: %s\n", mystring[j]); 
    } 
    return(0); 
} 

anzumerken, dass keine Notwendigkeit besteht, eine bestimmte Flagge hinzuzufügen, während es gcc mit kompilieren.

+0

* Sie ändern i innerhalb Ihrer for-Schleife * -> dies ist wahr und schlampig, erklärt aber nicht das Problem des OP. – chqrlie

+0

Meine erste Vermutung war 'c99' for-loop Konvention, die ich denke, ist nicht das Problem. Es kann auch ein Problem innerhalb des Codes mit mehreren isolierten Codeblöcken mit {..} geben. – hmofrad

+0

Ich habe den Bearbeitungsverlauf überprüft: Einige der Klammern wurden in einer der Bearbeitungen entfernt, aber das ist nicht die Ursache für das Problem.Ich denke, die wahrscheinlichste Ursache ist ein falsches ';', das der OP nicht kopiert hat. – chqrlie

0

Wy wilde Vermutung ist, dass Sie eine zusätzliche ; am Ende Ihrer ursprünglichen for Erklärung haben, wie folgt aus:

for (int i = 0; i < strlen(mystring[cmd_index]); i++); 
{ 
    ... 

Dies würde den for Schleife einen leeren Körper effektiv geben und der nachfolgende Block außerhalb der Umfang der for Schleife.

Vermeiden Sie diese Art von Fehler, indem Sie die { am Ende der for Zeile statt auf einer separaten Zeile.

+0

Ich habe nach dem überprüft; am Ende der for-Schleife, wenn der Fehler aufgetreten ist. Das war nicht das Problem. –

+0

@TommySaechao: können Sie den Code für die gesamte Funktion, die das Problem verursacht, kopieren und neu einlesen, indem Sie den gesamten Code auswählen und Strg-K drücken – chqrlie

Verwandte Themen