2016-04-14 7 views
-6

Ich versuche, die Wörter der Zeichenfolge umzukehren (nicht die Wörter selbst). Ich versuche, zweidimensionales Array nur mithilfe von Zeigern dynamisch zuzuweisen (ohne Array-Syntax zu verwenden). Mein Programm kompiliert gut, aber am Ende wird nur ein Wort als Ausgabe mit Leerzeichen hier und da angezeigt. Hier ist mein Code.2-dimensionalen Array mit Zeigern rein logisch zuweisen

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

void rev(char *x, int n); 
int words(char * p); 

int main() 
{ 
    char *p = (char *)malloc(101*sizeof(char)); 
    fgets(p, 101, stdin); 
    rev(p, words(p)); 
    free(p); 
    return 0; 
} 

void rev(char *x, int n) 
{ 
    char **y = (char **)malloc(101*sizeof(char *)); 
    int i = 0; 

    int *j = (int *)calloc(101, sizeof(int)); 
    *y = (char *)malloc(101*sizeof(char)); 
    while(*x!='\n') 
    { 
     if(*x==' ') 
     { 
      i++; 
      *(y+i) = (char *)malloc(101*sizeof(char)); 
     } 
     else 
     { 

      *(*(y+i)+(*(j+i))) = *x; 
      (*(j+i))++; 
     } 
     x++; 
    } 
    i++; 
    int z, q; 
    for(z=i-1; z>0; z--) 
    { 
     for(q=0; q<(*(j+i)); q++) 
     { 
      printf("%c", *(*(y+z)+(q))); 
     } 
     printf(" "); 
    } 
    for(q=0; q<*j; q++) 
    { 
     printf("%c", *(*(y)+(q))); 
    } 
    printf("\n"); 
    for(q=0; q<i; q++) 
    { 
     free(y+i); 
    } 
    free(j); 
    free(y); 
} 

int words(char * p) 
{ 
    int x = 0; 
    while(*p!='\n') 
    { 
     if(*p==' ') 
     { 
      x++; 
     } 
     p++; 
    } 
    return ++x; 
} 

Ich möchte es nur mit Zeigerarithmetik tun. Ich habe es seit 20 Stunden probiert und konnte es nicht herausfinden. Kann jemand den Fehler erklären und korrigieren? Eingang Hello World Ausgang

Hello 

Eingang This is my input Ausgang

This 
+1

Hinweis: Sie sagen, [Sie nicht das Ergebnis von 'malloc werfen sollte()' in C] (http: // Stackoverflow. com/questions/605845/do-i-cast-das-Ergebnis-von-malloc). – MikeCAT

+1

Ihr Code enthält kein 2D-Array. 'char **' ist ** nicht ** ein 2D-Array und kann nicht auf eins zeigen. Ein Zeiger ist kein Array oder umgekehrt. Und benutzen Sie keine _magic numbers_. – Olaf

+0

'für (q = 0; q MikeCAT

Antwort

1

Dies ist ein wirklich schwieriges Problem (die Worte in einem String Wende-). Eine der besten Lösungen für dieses Problem ist, dass Sie eine Funktion definieren, um die gesamte Zeichenfolge umzukehren, und dann Wort für Wort der resultierenden Zeichenfolge zu lesen. Wenn Sie in einem Leerzeichen ankommen, verwenden Sie erneut die umgekehrte Funktion und drucken sie.

Original-String

Hallo Welt

Erster Schritt

dlrow olleh

Zweiter Schritt

Welt hallo

Diese Lösung ist viel einfacher als Ihre komplizierte Lösung.

die Dies kann eine mögliche reverse Funktion sein, die ich oben erwähnt:

void rev(char *word, int len) 
{ 
    char c; 
    if(len>1) 
    { 
    c=word[len-1]; 
    word[len-1]=word[0]; 
    word[0]=c; 
    rev(word+1, len-2); 
    } 
    return; 
} 
+0

Danke für Ihren neuen Ansatz – bharadwaj

+0

@bharadwaj Sie sind willkommen, wenn es geholfen hat, bitte markieren Sie meine Antwort als die richtige – reshad

+0

Ihr Ansatz hat wirklich geholfen. In der Tat werde ich Ihren Ansatz von jetzt an verwenden. Aber ich kann deine Antwort nicht als richtig bezeichnen, da das nicht meine Frage ist. – bharadwaj