2017-10-21 27 views
2

私はCで文字列spliter関数を記述しようとしています。スペースを区切り文字として使用して、2つ以上の文字列を分割します。cでの文字列と文字列の配列操作

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


void slice_input (char *t,char **out) 
{ 
    char *x,temp[10]; 
    int i,j; 
    x = t; 
    j=0; 
    i=0; 
    for (;*x!='\0';x++){ 
     if (*x!=' '){ 
      temp[i] = *x; 
      i++; 
     }else if(*x==' '){ 
      out[j] = temp; 
      j++;i=0; 
     } 
    } 
} 

int main() 
{ 
    char *out[2]; 
    char inp[] = "HEllo World "; 

    slice_input(inp,out); 
    printf("%s\n%s",out[0],out[1]); 
    //printf("%d",strlen(out[1])); 
    return 0; 
} 

Expeted出力: - - :

HEllo 
World 

が、それが表示されている: -

World 
World 

あなたが助けてくださいすることができ、それは、より多くのPython.Hereでスプリット目的球のようなコードです? tempがローカル変数である

+2

デバッガは右だが、私はstrtokはを(使用するOPのためのより良いことだと思うあなたの友人 –

答えて

3

out[j] = temp;

。関数が終了するとすぐに有効範囲外になります。したがって、はアクセス時に未定義動作を呼び出すことでゴミを指します。

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

void slice_input(char *t, char out[2][10]) { 
    char *x, temp[10]; 
    int i,j; 
    x = t; 
    j=0; 
    i=0; 
    for (;*x!='\0';x++) { 
    if (*x!=' ') { 
     temp[i] = *x; 
     i++; 
    } else if(*x==' ') { 
     strcpy(out[j], temp); 
     j++; 
     i=0; 
    } 
    } 
} 


int main() 
{ 
    char out[2][10]; 
    char inp[] = "HEllo World "; 

    slice_input(inp,out); 
    printf("%s\n%s",out[0],out[1]); 
    return 0; 
} 

出力:

HEllo 
World 
+0

こともある)soluion –

+3

@KrzysztofSzewczyk OPは '自分自身を実装したいですstrtok() '、おそらく練習のためです。 – gsamaras

+0

オンラインでstrtokのソースコードをチェックしてください! –

0

http://www.cplusplus.com/reference/clibrary/cstring/strtok/

簡単な修正は、このように、outのための2次元配列を使用し、out[j]temp文字列をコピーするstrcpy()を使用することです

ウェブサイトから:

char * strtok(char * str、const char * delimiters);最初の 呼び出しでは、この関数はstrの引数としてC文字列を受け取ります。最初の文字はトークンを検索する開始位置として使用されます( )。 以降の呼び出しでは、この関数はヌルポインターを要求し、最後のトークンの末尾の直後に の位置を新しい開始の 検索用の場所として使用します。

strtokの呼び出しでstrの終了ヌル文字が見つかると、この関数への以降のすべての呼び出し(NULLポインタが最初の引数の )はNULLポインタを返します。

パラメータ

str切り捨てるC文字列。この文字列は、 が小さな文字列(トークン)に分割されて変更されています。代替方法として、null ポインターを指定することができます。この場合、関数は前回成功した関数呼び出しが終了した場所をスキャンし続けます( )。 デリミタ文字区切り文字を含むC文字列。これらは がコールごとに異なる場合があります。戻り値

stringで最後に検出されたトークンへのポインタ。取り出すトークンが残っていない場合、ヌルポインターは です。

/* strtok example */ 
#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char str[] ="- This, a sample string."; 
    char * pch; 
    printf ("Splitting string \"%s\" into tokens:\n",str); 
    pch = strtok (str," ,.-"); 
    while (pch != NULL) 
    { 
    printf ("%s\n",pch); 
    pch = strtok (NULL, " ,.-"); 
    } 
    return 0; 
} 

あなたはトークンに文字列を分割するために、この機能を使用することができます - いくつかの独自の関数を使用する必要はありません。あなたのコードはガベージのように見えます。フォーマットしてください。 あなたのソースはpropably次のようになります。

char * 
strtok(s, delim) 
    char *s;   /* string to search for tokens */ 
    const char *delim; /* delimiting characters */ 
{ 
    static char *lasts; 
    register int ch; 

    if (s == 0) 
    s = lasts; 
    do { 
    if ((ch = *s++) == '\0') 
     return 0; 
    } while (strchr(delim, ch)); 
    --s; 
    lasts = s + strcspn(s, delim); 
    if (*lasts != 0) 
    *lasts++ = 0; 
    return s; 
} 
+0

実際に私はPythonの流出のようなfuntionを作りたいと思います。デリミタamdはトークンの配列を返します.LIBRARY FUNCTIONS.Btwを使用せずに助けてくれます。 –

+0

strtokのソースを与えました。 –

+0

ええ、それだけを理解しようとしています...そのことに感謝します。 –