2012-01-10 24 views

答えて

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()からのエラー検出を行う必要があります。さらに、そうすることは非常に厄介です。ただし、サンプル文字列を使用すると、そのことについて心配する必要はありません。

+1

あなたは私を打つこの時間を! =) –

+0

ああ。あなたはいくつか勝つ、いくつかを失う。投票をしてください。 –

1

エラーはstrtokコールで、strtolではなくエラーです。文字列リテラルにstrtokを呼び出すことはできません。文字列リテラルを変更しようとしているからです。文字列リテラルを変更すると、C++で未定義の動作が発生します。

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; 
    } 
関連する問題