0

私はこのコードを持っています:

std::string name = "kingfisher";
char node_name[name.size()+1];
strcpy(node_name,name.c_str());
node_name[name.size()] = '\0';

DevC++ では問題なく動作しましたが、Visual C++ では「name.size() は定数値でなければならない」という問題が発生しました。問題を解決するには?の宣言で const 値を使用する必要があることはわかっていますが、node_name(上記の場合のように) できない場合もあります。ありがとう!

4

5 に答える 5

4
char node_name[name.size()+1];

の値はname.size()コンパイル時に不明であるため、上記の宣言でnode_nameは ISO C++ では許可されていない可変長配列 (VLA) です。

DevC++ では、コンパイル構成で有効になっている VLA 機能を拡張機能として提供するため、コンパイルして動作します。

std::string、またはchar *とともにnew[]/delete[]、ニーズに合ったものを使用してください。

特定のケースでは、つまり、文字列リテラルが既にわかっている場合は、次のように書くことができます。

char node_name[] = "kingfisher"; //this works great!

ただし、文字列値がわからず、どこかからコピーしたい場合は、次のようにします。

char *node_name = new char[name.size()+1];
std::strncpy(node_name, name.c_str(), name.size()+1); //use strncpy

//work with node_name

//must deallocate the memory
 delete []node_name; //not `delete node_name;`

上記のように、前者は 3 番目の引数としてもバッファ サイズを使用し、後者は使用しないため (通常は安全ではありませんが、この場合はそうではありません)、 のstd::strncpy代わりに使用します。std::strcpy

于 2012-06-14T05:04:36.940 に答える
3

可変長配列は標準 C++ の一部ではありません。コンパイル時にサイズを指定する必要があります。name.size()実行時に発生します。マジック ナンバーまたは定数を説明するには、コメントで十分です。

char node_name[11]; //length of "kingfisher" + null

コンパイル時に文字列の長さがわからない場合 (ただし、例ではわかっている場合)、Nawaz の回答でよく説明されているように、動的配列を使用できます。

于 2012-06-14T05:04:27.800 に答える
2

多くの選択肢があります:

std::string name = "kingfisher";
char* node_name = alloca(name.size() + 1);
strcpy(node_name, name.c_str());
// no need to explicitly set the '\0' - strcpy copies it too
...OR...
char* node_name = new char[name.size() + 1];
strcpy(node_name, name.c_str());
...OR...
char* node_name = strdup(name.c_str());  // allocate on malloc/free/realloc "C" heap
...OR...
std::vector<char> node_name(name.data(), name.data() + name.size()); // sans '\0'
...OR...
std::vector<char> node_name(name.c_str(), name.c_str() + name.size() + 1); // with '\0'
...OR...
std::string node_name = node;  // do something with node_name.c_str() / .data() etc.

注: ステファンの削除された回答に対する Ernest の「C++ では malloc() を使用しないでください。new[] を使用してください」というコメントにもかかわらず、必要になる場合があります。たとえば、メモリを再割り当てまたは解放する可能性のある C コードにポインターを渡す場合です。

于 2012-06-14T05:19:57.207 に答える
0

実行時にサイズが決定される配列は、可変長配列またはVLAと呼ばれます。VLA は C99 の機能です。一部の C++ コンパイラは、これらを拡張機能としてサポートしていますが、サポートしていないコンパイラもあります。お使いのバージョンの Visual C++ にはないようです。

スタックではなく、常にnode_name動的に割り当てることができます。new

于 2012-06-14T05:05:42.117 に答える
0

私の最初のアプローチは、配列を何に使用しているかを調べ、それを行うためのより良い方法があるかどうかを尋ねることです.

配列が本当に必要な場合は、 vector: をお勧めします。これは動的にサイズを変更できますが、削除する必要はありません。

    std::string name = "kingfisher";
    std::vector<char> name_buff(name.begin(), name.end());
    name_buff.push_back(0);  // nul-terminate
    char *node_name = &name_buff[0];
    // ...
于 2012-06-14T08:30:40.490 に答える