このコードの何が問題なのか誰か教えてもらえますか?
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()
ます。
問題は山積みです。
コア ダンプが発生するのは、文字列"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()
。さらに、そうすることはかなり困難です。しかし、サンプル文字列を使えば、その心配はありません。
エラーはstrtok
呼び出しにあり、 ではありませんstrtol
。strtok
文字列を変更しようとするため、文字列リテラルを呼び出すことはできません。文字列リテラルを変更すると、C++ で未定義の動作が発生します。
問題はすでに議論されているので、別のアプローチを示したいと思います:
#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;
}