2016-04-14 46 views
-6

我試圖扭轉字符串(而不是單詞本身)的話。我想動態分配2維數組只使用指針(不使用數組語法)。我的程序編譯得很好,但最終只顯示一個單詞作爲輸出,在這裏和那裏都有空格。這是我的代碼。純粹使用指針動態分配2維數組

#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; 
} 

我想這樣做只使用指針算術。我一直在嘗試過去20個小時,但無法弄清楚。任何人都可以解釋錯誤以及如何糾正錯誤嗎? 輸入 Hello World 輸出

Hello 

輸入 This is my input 輸出

This 
+1

注:他們說,[你不應該投的malloc'()的結果在'C](HTTP://計算器。 COM /問題/ 605845/DO-I-鑄了對結果的-的malloc)。 – MikeCAT

+1

代碼中沒有2D數組。 'char **'是**不是**二維數組,不能指向一個。指針不是數組,反之亦然。並且不要使用_magic numbers_。 – Olaf

+0

對於(q = 0; q MikeCAT

回答

1

這是一個非常棘手的問題(倒車詞語的字符串)。解決此問題的最佳解決方案之一是,您可以定義一個函數來反轉整個字符串,然後開始逐字讀取所得到的字符串,並且如果您到達某個空間,再次使用反轉函數並將其打印出來。

原始字符串

的hello world

第一步

dlrow 2009東海生日賀

第二步

世界你好

該解決方案是比你的複雜的解決方案變得更加容易。

這可能是一個可能的reverse功能,我在上面提到:

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

感謝您的新方法 – bharadwaj

+0

@bharadwaj歡迎您,如果有幫助,請將我的答案標記爲正確的 – reshad

+0

您的方法確實有幫助。事實上,我將從現在開始使用你的方法。但我不能將你的答案標記爲正確答案,因爲那不是我所問的答案。 – bharadwaj