2016-08-21 5 views
0

この質問を読む前に、私の質問は学校の割り当てに関係することに注意してください。この代入のために私たちが使用できるのはmalloc()だけです。他のすべては、他のライブラリを使用せずに行わなければなりません。文字列を空白で分割する

私は関数ft_split_whitespacesを呼び出しています。この関数は文字列を入力として取り、それを単語に「分割」します。言葉はスペース、タブ、改行で区切られています。例に関して

#include <stdio.h> 

char **ft_split_whitespaces(char *str); 

int main(void) 
{ 
    char *str = "what is"; 
    char **test = ft_split_whitespaces(str); 

} 

各インデックスの結果上記

test[0] = "what" 
test[1] = "is" 
test[2] = NULL 

しかし、私は、テストの結果[0]を印刷することができていなければなりません。他のすべてのインデックスは表示されません。関数の結果を出力するはずのコードの例を示します。

int i = 0; 
while(test[i] != NULL) 
{ 
    printf("%s", test[i]); 
    i++; 
} 

コードのこの部分が実行されると、テスト[0]だけが出力に出力されます。私は何時間も自分のコードをデバッグしようとここに座っていました。誰かが余裕を持っていて、自分のコードを見ても気にならないなら、それは大変感謝しています。私はmallocをどのように使用しているかに問題があるかもしれないと感じていますが、それはまだわかりません。

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


int  count_whitespaces(char *str) 
{ 
    int space_count; 
    int i; 

    space_count = 0; 
    i = 0; 
    while(str[i] != '\0') 
    { 
     if(str[i] == ' ' || str[i] == 9 || str[i] == '\n') 
     { 
      if(str[i+1] != ' ' && str[i+1] != 9 && str[i+1] != '\n') 
       space_count++; 
     } 
     i++; 
    } 
    return (space_count); 
} 

int  check_whitespace(char c) 
{ 
    if (c == ' ' || c == 9 || c == '\n' || c == '\0') 
    { 
     return (1); 
    } 
    else 
     return(0); 
} 

int  count_characters(char *str, int i) 
{ 
    int char_count; 

    char_count = 0; 
    while(str[i]) 
    { 
     if(str[i+1] != ' ' && str[i+1] != 9 && str[i+1] != '\n') 
      char_count++; 
     else 
      break; 
     i++; 
    } 
    return (char_count); 
} 

char **ft_split_whitespaces(char *str) 
{ 
    int  i; 
    int  j; 
    int  k; 
    char **word; 
    int  space; 

    i = 0; 
    j = 0; 
    k = 0; 
    word = (char**)malloc(sizeof(char*)*(count_whitespaces(str) + 2)); 
    while(str[i] != '\0') 
    { 
     if (check_whitespace(str[i]) == 1) 
      i++; 
     else 
     {   
      if((word[j] = malloc(sizeof(char) * (count_characters(str, i) + 1))) == NULL) 
       return (NULL); 
      while (check_whitespace(str[i]) == 0) 
      { 
       word[j][k] = str[i]; 
       i++; 
       k++; 
      } 
      j++; 
     }  
    } 
    j++; 
    word[j] = NULL; 
    j = 0 
    return word; 
} 
+1

使用' 'のようになります。 – BLUEPIXY

答えて

2

kをリセットするのを忘れました。 ft_split_whitespaceswhileループは\ t'`代わり9` `の

while (str[i] != '\0') { 
    if (check_whitespace(str[i]) == 1){ 
     i++; 
    } 
    else { 
     if ((word[j] = 
      malloc(sizeof(char) * (count_characters(str, i) + 1))) == NULL){ 
     return (NULL); 
     } 
     while (check_whitespace(str[i]) == 0) { 
     word[j][k] = str[i]; 
     i++; 
     k++; 
     } 
     word[j][k] = '\0'; 
     j++; 
     k = 0;    // reset k 
    } 
    } 
+0

ありがとう、私もそれを実現しませんでした! –

0

私は実際に私のコードで間違っていたと私はこの質問(スタックオーバーフローのおかげで!とにかくそれを投稿することにしました。なぜなら、自分自身のような新参者をコーディングするのに良い学習体験かもしれないと思ったからです。

これは私の問題が発生していた場所です。ループ私は再び

word = (char**)malloc(sizeof(char*)*(count_whitespaces(str) + 2)); 
を使用してそれをmallocで確保しながら、

word = (char**)malloc(sizeof(char*)*(count_whitespaces(str) + 2)); 
    while(str[i] != '\0') 
    { 
     if (check_whitespace(str[i]) == 1) 
      i++; 
     else 
     {   
      if((word[j] = malloc(sizeof(char) * (count_characters(str, i) + 1))) == NULL) 
       return (NULL); 
      while (check_whitespace(str[i]) == 0) 
      { 
       word[j][k] = str[i]; 
       i++; 
       k++; 
      } 
      j++; 
     }  
    } 

は私が

word = (char**)malloc(sizeof(char*)*(count_whitespaces(str) + 2)); 

そして実際以内に次のコードを使用して、whileループの外**言葉を私の文字をmallocで確保しました

mallocを同じ変数に複数回使用すると、あらゆる種類の奇妙な問題が発生していました。だからwhileループの中で、私はchar *単語として宣言された新しい変数を使って終わりました。ここで正しいコードでwhileループの部分があります。

word = (char**)malloc(sizeof(char*)*(count_whitespaces(str) + 2)); 
    while(str[i] != '\0') 
    { 
     if (check_whitespace(str[i]) == 1) 
      i++; 
     else 
     {   
      words = malloc(sizeof(char) * (count_characters(str, i) + 1)); 
      k = 0; 
      while (check_whitespace(str[i]) == 0) 
      { 
       words[k] = str[i]; 
       i++; 
       k++; 
      } 
      words[k] = '\0'; 
      word[j] = words; 
      j++; 
     }  
    } 
+0

いいえ、はるかに簡単です。 – deamentiaemundi

関連する問題