2017-10-27 11 views
1

文字列を解析するためにstrtok()関数を使いたいと思います。返されたトークンに値のコピーを作成したいと思います(この関数から返されたトークンはポインタです)。strtok()トークンの値を格納していますか?

私のAIMは、基本的に、各トークンのアドレスに値のコピーを保持する文字列の配列を指すポインタを作成することです。私のコードは、これまでこれを試してみました(そして失敗しています)。(また、トークンが3文字分のスペースを十分に確保できるようにします。

(私は文字列を分割する方法の私の方法を変更することに興味がないんだNOTE - と私はstrtokはする欠点がある知っています)

char words[] = "red, dry, wet, gut"; // this is the input string 

char* words_split[100]; 
char token[3]; // creates space for a token to hold up to 3 characters (?) 

int count = 0; 

char* k = strtok(words, ","); // the naming of k here is arbitrary 
while (k != NULL) { 
    k = strtok(NULL, ","); 
    token[0] = *k; // I'm aware the 0 here is wrong, but I don't know what it should be 
    words_split[count] = token; 
    count++; 
} 

そして、私のことができるようにしたいのですがwords_splitから個々の要素、すなわち赤のそれぞれにアクセスします。

+2

C++では文字列を分割するために 'strtok()'を使用しない方がよいでしょう。 – user0042

+0

あなたの質問: 'strncpy()'を使ってトークンの値をコピーする必要があります。 – user0042

+0

@ user0042それはおそらく最善の方法ではないことに気付いています。もう少しstrncpy()を使う方法を説明できますか?どこでコードの中でそれを配置するのでしょうか? –

答えて

2

あなただけの文字列を保持するために、ベクターを使用して、C++を使用しているので:

char words[] = "red, dry, wet, gut"; // this is the input string 

    std::vector<std::string> strs; 

    char* k; 
    for (k = strtok(words, " ,"); k != NULL; k = strtok(NULL, " ,")) { 
    strs.push_back(k); 
    } 

    for(auto s : strs) 
    { 
    std::cout << s << std::endl; 
    } 

あなただけs.c_str()を行い、ベクトルに格納されている文字列から、生のポインタにアクセスする必要がある場合。

0

変数tokenは不要です。あなたのコードは、words_splitのすべての要素が同じトークンを指し示すように設定しています。その結果、文字列の最後のトークンになります。

ちょうどstrtokによって返されたアドレスを格納します。

words_split[count++] = strdup(k); 

これはPOSIX関数ではなく、標準C++がある:あなたがコピーを作成する必要がある場合は、あなたがstrdup()機能を使用することができます

int count = 0; 
k = strtok(words, ","); 
while (k) { 
    words_split[count++] = k; 
} 

。必要に応じて実装についてはusage of strdupを参照してください。

また、mnisticの回答のように、C文字列の代わりにstd::stringを使用してください。

0

これは基本的にmnisticの答えの化粧バージョンです。あなたに役立つかもしれない場合に備えて追加する。

#include <bits/stdc++.h> 
using namespace std; 


int main() 
{ 
    char sentence[] = "red, dry, wet, gut"; // this is the input string 

    vector<char *> words; 

    for(char *token=strtok(sentence,","); token != NULL; token=strtok(NULL, ",")) 
    { 
     const int wordLength = strlen(token) + 1; 
     char *word = new char [wordLength]; 
     strcpy(word, token); 
     words.push_back(word); 
     cout << "\nWord = " << word; 
    } 


    // cleanup 
    for(int i=0; i<words.size(); i++) 
    { 
     delete[] words[i]; 
    } 

    return 0; 
} 
関連する問題