Почему эта комбинация strtol и strtok не работает? - PullRequest
0 голосов
/ 10 января 2012

Может кто-нибудь сказать мне, что не так с этим кодом?

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 ]

1 голос
/ 10 января 2012

Ошибка с вызовом strtok, а не с strtol.Вы не можете вызвать strtok для строкового литерала, так как он попытается изменить строку.Изменение строкового литерала вызывает неопределенное поведение в C ++.

1 голос
/ 10 января 2012

Поскольку проблема уже обсуждалась, я хотел бы показать альтернативный подход:

#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;
     }
1 голос
/ 10 января 2012

Проблемы легиона.

Я ожидаю, что дамп ядра происходит из-за того, что строка "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();Далее, это довольно чревато.Однако с примером строки вам не придется беспокоиться об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...