0

Dev C++ によって正しくコンパイルされたコードがあります。VS2012 Express を使用して実行しようとすると、「warning C4996: '': This function or variable may be unsafe.」という警告が表示されました。代わりに strtok_s の使用を検討してください。非推奨を無効にするには、_CRT_SECURE_NO_WARNINGS を使用します。詳細については、オンライン ヘルプを参照してください」

セキュリティ警告を無効にしようとしましたが、VS Express で _CRT_SECURE_NO_WARNINGS オプションが利用できないことがわかりました。そのため、この警告を回避するには、strtok の代わりに strtok_s を使用するようにコードを変更する必要がありました。しかし、コードはエラーなしで最後まで実行しても、結果が表示されないという問題が発生しました。明らかに、ファイルの読み取りは発生しません。これは、Dev C++ でうまく機能した以前のコードです。

const char* token[MAX_TOKENS_PER_LINE] = {}; // initialize to 0
    // parse the line
    token[0] = strtok(buf, DELIMITER); // first token
    if (token[0]) // zero if line is blank
    {
      for (n = 1; n < MAX_TOKENS_PER_LINE; n++)
      {
    token[n] = strtok(0, DELIMITER); // subsequent tokens
        if (!token[n]) break; // no more tokens

これは、VS2012エクスプレスを使用して実行しようとしたものです

const char* token[MAX_TOKENS_PER_LINE] = {}; // initialize to 0
    char* next_token[MAX_TOKENS_PER_LINE] = {}; // initialize to 0
    //char* next_token;
    // parse the line
    token[0] = strtok_s(buf, DELIMITER, &next_token[0]); // first token
    if (token[0]) // zero if line is blank
    {
      for (n = 1; n < MAX_TOKENS_PER_LINE; n++)
      {
    token[n] = strtok_s(0, DELIMITER, &next_token[n]); // subsequent tokens
        if (!token[n]) break; // no more tokens

2番目のコードの何が問題になっていますか?

4

1 に答える 1

1

これは、次の連続する への呼び出しで、ポインター ( への最後の引数) が最後の呼び出しによって埋められることがstrtok_s期待されるためです。contextstrtok_s

呼び出しごとに異なる (初期化されていない) ポインターを使用します。これは、コンテキストが失われるか、一見ランダムなポインターをコンテキストとして使用することを意味します。

next_token配列の代わりにアウトコメントされた変数を使用する必要があります。

于 2013-05-02T05:42:52.063 に答える