2016-04-18 13 views
-4

Ich versuche 1.19 von K Übung, um herauszufinden, & R.undefiniert Ausgang (K & R 1.19)

eine Funktion Reverse-Schreiben (n), die die characte s Zeichenfolge umkehrt. es, ein Programm zu schreiben, das

Hier zu einem Zeitpunkt seiner Eingabe eine Zeile umkehrt ist mein Code

#include <stdlib.h> 
#include <stdio.h> 
#define MAX 150 

void reverse(char s[]); 

int main() 
{ 
    int c, i; 
    char string[MAX]; 

    i=0; 
    while((c=getchar())!= EOF){ 
     while((c=getchar()) != '\n'){ 
      string[i] = c; 
      i++; 
     } 
     reverse(string); 
    } 
    return 0; 
} 
void reverse(char s[]){ 
    int i, j; 
    for(i=0; i<MAX-1; i++){ 
     if(s[i] == '\n') 
      break; 
    } 
    for(j=i;j>=0;j--) 
    printf("%c", s[j]); 
    printf("\n"); 

} 

Das Problem ist, dass ich eine nicht definierte Ausgang haben, wie diese Undefined Behavior

Ich habe versucht, es herauszufinden, macht aber keinen Sinn für mich. Vielen Dank im Voraus für Ihre Hilfe.

+0

enthält Was Sie versuchen zu tun? – Boiethios

+0

"Schreiben Sie eine Funktionsumkehrung (s), die die Zeichenkette s umkehrt. Verwenden Sie sie, um ein Programm zu schreiben, das seine Eingabe um eine Zeile umkehrt" – Emanuele

+1

C Zeichenketten sind nullterminiert ... Ihr Programm wird immer über die gesamte Länge gehen des Puffers, ohne die tatsächliche Länge des Strings zu betrachten. – fvu

Antwort

1

Es gibt mehrere Probleme in Ihrem Code sind.

Zuerst "schlucken" Sie das erste Zeichen mit Ihrer EOF-Prüfung; Der erste, der in das Array geschrieben wird, ist tatsächlich der zweite (wenn Sie string^ it would copy tring` in den Puffer eingegeben haben).

Dann kehren Sie den vollen Puffer (150 Zeichen) unabhängig von der Länge der enthaltenen Zeichenfolge um. Der Müll, den Sie sehen, ist nur der "Rest" des Puffers, den Sie auch umkehren. Beachten Sie die letzten Zeichen der "Müll" ist gnirt, die tring umgekehrt ist.

Dann achten Sie auch auf ordnungsgemäße String-Terminierung mit \0.

0

Versuchen ersetzt

while((c=getchar())!= EOF){ 
    while((c=getchar()) != '\n'){ 
     string[i] = c; 
     i++; 
    } 

mit:

while(((c=getchar())!= EOF) && (c != '\n')){ 
     string[i] = c; 
     i++; 
     string[i] = '\0' 
    } 
+0

Zuerst benötigen Sie einen Null-Terminator. Zweitens benötigen Sie keine verschachtelte Schleife. –

1

Ich würde Sie anstelle dieser Schleifen vorschlagen -

while((c=getchar())!= EOF){ 
    while((c=getchar()) != '\n'){ 

Versuchen Sie, diese -

while((c=getchar()) != '\n' && c!=EOF){ 

Und nach dieser Schleife vor dem Aufruf von Funktion -

string[i]='\0'; // append '\0' 

Und in Funktion reverse statt für '\n' Überprüfung der Überprüfung für '\0' -

for(i=0; s[i]!='\0'; i++){  //you use it to get length of string 
} 
/* Or better to get length use strlen() from <string.h> */ 
0
#include <stdio.h> 

#define MAX_ARRAY_SIZE 50 

void Reverse(char string[]); 

void Reverse(char string[]) 
{ 
    int stringSize = 0; 

i verwenden, um eine while-Schleife durch das String-Array iterieren und berechnen ihre Länge

while (string[stringSize] != '\0') 
    { 
     stringSize++; 
    } 

    int i = 0; 

I de-Inkrement string so, wenn es am Ende ausgedruckt wird es nicht die NULL enthält Terminator-Zeichen ('\ 0')

stringSize -= 1; 

    for (i = stringSize; i >= 0; i--) 
    { 
     printf("%c", string[i]); 
    } 

    printf("\n"); 
} 

int main(int argc, char *argv[]) 
{ 
    int i = 0; 
    int c = 0; 

    char string[MAX_ARRAY_SIZE]; 

Prüft, ob getchar EOF oder C ist, ist ein Zeilenende-Zeichen ('\ n')

while ((c = getchar()) != EOF && c != '\n') 
    { 
     string[i] = c; 
     i++; 
    } 

String Sets [i] auf ein Null-Zeile-Zeichen, so dass es nicht nur den Teil in umgekehrter Richtung aus dem gesamten Array drucken, die die Zeichenfolge

string[i] = '\0'; 

    Reverse(string); 

    return 0; 
}