为什么strtol和strtok的这种组合不起作用?

时间:2012-01-10 06:57:21

标签: c++ strtok strtol

有人能告诉我这段代码有什么问题吗?

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()

3 个答案:

答案 0 :(得分:1)

问题很多。

我希望核心转储是因为字符串"1-2-3-4"存储在只读内存中,所以当strtok()修改它(以隔离第一个令牌)时,程序崩溃。你说崩溃在strtol();这表明strtok()的返回值为NULL。

strtok()的第一次调用使用字符串作为参数;第二个调用在其位置传递NULL以指示“继续上次离开的位置”。如上所述,如果字符串是可修改的,那么您将解析1四次。

这更接近正确(虽然未经测试):

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 :(得分:1)

错误在于strtok来电,而非strtol。你不能在字符串文字上调用strtok,因为它会尝试修改字符串。修改字符串文字导致C ++中的未定义行为。

答案 2 :(得分: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;
     }