0

このコードの何が問題なのか誰か教えてもらえますか?

for(int i=0;i<4;i++)
{
    long int a = strtol(strtok("1-2-3-4","-"),(char**)NULL,10);
    cout << a <<endl
}

Solaris Unix で実行しています。それは私にセグメンテーション違反を与えています。

障害は にありstrtol()ます。

4

3 に答える 3

1

問題は山積みです。

コア ダンプが発生するのは、文字列"1-2-3-4"が読み取り専用メモリに格納されているためだと思います。したがって、 strtok()(最初のトークンを分離するために) 文字列を変更すると、プログラムがクラッシュします。あなたは、クラッシュが発生したと言いstrtol()ます。strtok()これは、からの戻り値が NULLであることを示唆しています。

の最初の呼び出しでstrtok()は、文字列が引数として使用されます。2 番目の呼び出しでは、代わりに NULL を渡して、「前回中断したところから続行する」ことを示します。1書かれているように、文字列が変更可能な場合、 4 回解析します。

これは正しいに近いです(テストされていませんが):

char  input[] = "1-2-3-4";
char *data = input;
for (int i = 0; i < 4; i++)
{
    char *token = strtok(data, "-");
    if (token != 0)
    {
        long int a = strtol(token, NULL, 10);
        cout << a << endl;
    }
    data = NULL;
}

一般に、からエラー検出を行う必要がありますstrtol()。さらに、そうすることはかなり困難です。しかし、サンプル文字列を使えば、その心配はありません。

于 2012-01-10T07:01:36.093 に答える
1

エラーはstrtok呼び出しにあり、 ではありませんstrtolstrtok文字列を変更しようとするため、文字列リテラルを呼び出すことはできません。文字列リテラルを変更すると、C++ で未定義の動作が発生します。

于 2012-01-10T07:01:49.030 に答える
1

問題はすでに議論されているので、別のアプローチを示したいと思います:

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

    int main ()
    {
      long int a;
      char str[] ="1-2-3-4";
      char * pch;

      pch = strtok (str,"-");
      while (pch != NULL)
      {
         a = strtol(pch,(char**)NULL,10);
         cout << a <<endl;

        pch = strtok (NULL, "-");
      }
      return 0;
     }
于 2012-01-10T07:11:23.543 に答える