2017-02-23 2 views
-3

Anfänger Programmierer hier. Ich versuche, eine Eingabe vom Benutzer zu nehmen, sie umzukehren und das Ergebnis anzuzeigen. Aus irgendeinem Grund werden anstelle der umgekehrten Zeichenfolge Leerzeichen gedruckt. Ich weiß, dass array[i] die richtigen Informationen hat, denn wenn ich diese Schleife auf Linie for (int i=0; i<count; i++) verwende, druckt es die richtigen Zeichen. Es wird nur nicht rückwärts gedruckt. Was bekomme ich hier nicht?Umkehren einer Zeichenfolge in C mit Schleife

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

int main(void) 
{ 
    printf("Please enter a word: "); 
    char *word = get_string(); 

    int count = strlen(word); 

    char array[count]; 

    for (int i=0; i< count; i++) 
    { 
     array[i] = word[i]; 
    } 

    for (int i=count-1; i==0; i--) 
    { 
     printf("%c ", array[i]); 
    } 
    printf("\n"); 
} 
+3

Ihr Zustand ist falsch. Es sollte sein: 'für (int i = zählen-1; i> = 0; i -)' –

+0

Was ist der Sinn des Kopierens der Eingabe wörtlich woanders? Warum nicht einfach von dort drucken, wo es ist? –

+0

Wenn Sie die Zeichenfolge umkehren möchten, muss sich Ihre erste for-Schleife ändern. Ein Array zählt die anderen Countdowns weiter –

Antwort

1
for (int i=0; i< count; i++) 
{ 
    array[i] = word[i]; 
} 

Sie gehen über die Schnur und kopieren Sie ihn, Sie tun Reverse es nicht.

In Ihrer Deklaration array gibt es auch einen kleinen Fehler in Warteposition, da Sie keinen Platz für den Zeichenabschluss '\0' lassen. Übergeben Sie Ihren Puffer an printf als eine C-Zeichenfolge, im Gegensatz zu Zeichen für Zeichen wird nicht definiert Verhalten.

So diese beiden besonderen Fehler zu beheben:

char array[count + 1]; 
array[count] = '\0'; 

for (int i = 0; i< count; i++) 
{ 
    array[i] = word[count - i]; 
} 

Als Randbemerkung, es nicht viel bedeuten kann eine VLA für diese kleine Übung zu verwenden, aber für größere Eingänge könnte es sehr gut Überlauf der Aufrufstapel. In acht nehmen.

+0

und Sie haben das Null-Beendigungszeichen vergessen (und der Puffer ist um 1) –

+0

@ Jean-FrançoisFabre - habe ich? Wenn das der Grund dafür ist, dass du deine Stimme abgegeben hast, bist du wirklich glücklich. – StoryTeller

+0

@ Jean-FrançoisFabre Er benutzt kein Abschlusszeichen und sein Puffer ist nicht zu kurz. Der Puffer enthält Zeichen, deren Länge bekannt ist, keine Zeichenfolge im C-Stil. Es ist nicht notwendig, ein zusätzliches Byte zuzuweisen. –

0
// the header where strlen is 
#include <string.h> 

/** 
* \brief reverse the string pointed by str 
**/ 
void reverseString(char* str) { 
    int len = strlen(str); 
    // the pointer for the left and right character 
    char* pl = str; 
    char* pr = str+len-1; 
    // iterate to the middle of the string from left and right (len>>1 == len/2) 
    for(int i = len>>1; i; --i, ++pl, --pr) { 
     // swap the left and right character 
     char l = *pl; 
     *pl = *pr; 
     *pr = l; 
    }; 
}; 

Und rufen Sie die Funktion:

int main(void) { 
    printf("Please enter a word: "); 
    char *word = get_string(); 

    // Just call the function. Note: the memory is changed, if you want to have the original and the reversed just use a buffer and copy it with srcpy before the call 
    reverseString(word) 
    printf("%s\n", word); 
}; 

Und

ändern
char array[count]; 

for (int i=0; i< count; i++) 
{ 
    array[i] = word[i]; 
} 

zu

// add an other byte for the null-terminating character!!! 
char array[count+1]; 
strcpy(array, word); 
+0

Code ohne Erklärung wird nicht ein bisschen helfen. Sie sollten Assembler-Code veröffentlichen, wenn Sie gerade dabei sind. –

+3

okay, aber es gibt Tonnen von Code-Schnipsel, die das auf SO tun (folgen Sie meinem doppelten Link). Das OP möchte die Probleme in seinem Code kennen. –

Verwandte Themen