2017-09-19 15 views
-2

文字列の文字配列を持っています。各文字列はnullで終了します。ポインタへのポインタ、動的メモリ割り当て

配列へのポインタは、最初の文字列の開始アドレスです。

const char* p = "I\0had\0a\0little\0lamb\0"; 

他の4文字列の開始アドレスはどのように保存できますか?

これは私が適用されているロジックですが、それが正常に動作しない:

const char** stara(const char* p, int n) { 
    const char** add=new char*[n]; 
    int k=0; 
    add[k]=p; 
    for(i=1;i<p.size()) { 
     if(p[i]=='\0') 
      add[++k]=&p[i+1]; 
    } 
+1

ポインタのベクトルを - と私は(今のところ、私はそれを作ることができるように)どのようなあなたの質問が表示されません動的メモリ割り当てと関係があります。 –

+0

私はポインタを作成する必要があることを知っている、私は初心者です。 –

答えて

0
const char* p = "I\0had\0a\0little\0lamb\0"; 

const char* arr[5]; 
arr[0] = p;       // "I" 
arr[1] = arr[0] + strlen(arr[0]) + 1; // "had" 
arr[2] = arr[1] + strlen(arr[1]) + 1; // "a" 
arr[3] = arr[2] + strlen(arr[2]) + 1; // "little" 
arr[4] = arr[3] + strlen(arr[3]) + 1; // "lamb" 

を。しかし、あなたはあなたの代わりにもっとこのようなものを使用し、その後、あなたが扱っしようとしているどのように多くの部分文字列がわからない場合は特に、実行時に動的にこれを実行しようとしている場合:

#include <vector> 

const char* p = "I\0had\0a\0little\0lamb\0"; 

std::vector<char*> vec; 
while (*p) 
{ 
    vec.push_back(const_cast<char*>(p)); 
    p += (strlen(p) + 1); 
} 

// vec[0] = "I" 
// vec[1] = "had" 
// vec[2] = "a" 
// vec[3] = "little" 
// vec[4] = "lamb" 

言われていること、ベース

n文字列(それぞれが '\ 0'で終わる)を含む文字配列の最初の要素へのポインタpが与えられた場合、すべてのnの開始アドレスの動的に割り当てられた配列を返します文字列

あなたはより多くのこのような何かが必要です。

const char** stara(const char* str) 
{ 
    const char* p = str; 
    int n = 0; 
    while (*p) 
    { 
     ++n; 
     p += (strlen(p) + 1); 
    } 

    const char* *arr = new const char*[n+1]; 

    p = str; 
    n = 0; 
    while (*p) 
    { 
     arr[n++] = p; 
     p += (strlen(p) + 1); 
    } 

    arr[n] = NULL; 

    return arr; 
} 

const char* *arr = stara("I\0had\0a\0little\0lamb\0"); 

// arr[0] = "I" 
// arr[1] = "had" 
// arr[2] = "a" 
// arr[3] = "little" 
// arr[4] = "lamb" 
// arr[5] = NULL 

delete[] arr; 

Live demo

+0

pが可変である場合はどうすればよいですか?動的メモリ割り当てを使用してこれを一般化した方法を教えてください –

+0

私はnew operatorをC++で使っているプロセス –

+1

'new []'を(学習目的以外の)直接使用する理由はありません。 'std :: vector'はすでに動的にサイズ変更可能な配列です。コードは、 'new []'を直接使用する方がずっと複雑です。そして 'new'を使うことはあなたの質問の範囲外です。必要な場合は、実際の要件に関する詳細を添えて質問を編集してください。新しい質問を投稿する。 –

2

あなたはそのために自分でコードを記述する必要があります。どのように文字列の数を知っていますか?

あなたが4になるようにnを知って、あなたは4つのポインタをしたいと仮定すると、あなたが行うことができます:小さな文字列の罰金だ

const char *p0 = p; 
const char *p1 = p0 + strlen(p0) + 1; 
const char *p2 = p1 + strlen(p1) + 1; 
const char *p3 = p2 + strlen(p2) + 1; 
関連する問題