strtok_r, вызывающий присваивание, делает указатель из целого числа без приведения

Я пытаюсь токенизировать строку в C и сохранить токены в несколько переменных, используя strtok_r. Насколько я могу судить, я использую его точно так, как задокументировано:

char *saveptr;

char *ticketuser = strtok_r(request, ":", &saveptr);
char *ticketservice = strtok_r(NULL, ":", &saveptr);
char *ticketkey = strtok_r(NULL, ":", &saveptr);
//And so on...

Где «запрос» — это строка токенов, разделенных двоеточием. Когда я пытаюсь скомпилировать, я получаю «назначение делает указатель из целого числа без приведения» в каждой строке, где я назначаю одну из строк. Поскольку strtok_r должен возвращать char*, я не понимаю, в чем проблема.

РЕДАКТИРОВАТЬ: Вот ВСЕ мой код:

#include <stdio.h>

char *add( char *request ) {

  char *name = "add";
  char *secret = "secret1";
  char *failcode = "0:add:0";
  char returncode[80];
  char *saveptr;

  char *username = strtok_r(request, ":", &saveptr);
  char *servicename = strtok_r(NULL, ":", &saveptr);
  int parameter1 = atoi(strtok_r(NULL, ":", &saveptr));
  int parameter2 = atoi(strtok_r(NULL, ":", &saveptr));
  int ticketlead1 = atoi(strtok_r(NULL, ":", &saveptr));
  char *ticketuser = strtok_r(NULL, ":", &saveptr);
  char *ticketservice = strtok_r(NULL, ":", &saveptr);
  char *ticketkey = strtok_r(NULL, ":", &saveptr);

  //Catch any issues with the request
  if (strcmp(username,ticketuser) != 0){
    printf("username did not match ticket username\n");
    return failcode;
  }//if
  else if (strcmp(servicename,ticketservice) != 0){
    printf("service name did not match ticket service name\n");
    return failcode;
  }//else if
  else if (strcmp(secret,ticketkey) != 0){
    printf("secret key did not match ticket secret key\n");
    return failcode;
  }//else if

  //request was good, return value
  else{
    int val = parameter1 + parameter2;
    sprintf(returncode, "1:add:%d", val);
    return returncode;
  }//else

}//add


int main( int argc, char **argv ) {

  char *returned;
  char *req = "user:serv:5:8:1:user:serv:secret1";
  returned  = add(req);

  printf(returned);
  printf("\n");

  return 1;

}//main

person JMcMinn    schedule 10.06.2013    source источник
comment
Это должно быть хорошо (ideone.com/Dty4x7); вам нужно опубликовать полный тестовый пример.   -  person Oliver Charlesworth    schedule 10.06.2013
comment
Вы забыли #include <string.h>. Но вы также должны компилировать с -Wall -Werror, так как это сказало бы вам об этом...   -  person Oliver Charlesworth    schedule 10.06.2013
comment
Шлепает по лбу Спасибо. У меня было ощущение, что это будет что-то вроде этого. Я компилирую с -Wall, но думаю, что теперь мне придется добавить -Werror.   -  person JMcMinn    schedule 10.06.2013
comment
-Werror просто превращает все предупреждения в ошибки, препятствуя успешной компиляции. Это очень полезно! Я также рекомендую -Wextra.   -  person Oliver Charlesworth    schedule 10.06.2013
comment
Ясно спасибо. Что делает Wextra?   -  person JMcMinn    schedule 10.06.2013
comment
Это включает кучу полезных предупреждений, которые не покрываются -Wall. См. gcc.gnu.org/onlinedocs/gcc/Warning-Options. .html#Warning-Options для получения полного списка флагов, которые вы можете использовать.   -  person Oliver Charlesworth    schedule 10.06.2013
comment
Хорошо, еще раз спасибо. Хм... теперь строка char *username = strtok_r(request, :, &saveptr); вызывает segfault (так что, по-видимому, все они будут). Проблемы, проблемы...   -  person JMcMinn    schedule 10.06.2013
comment
Опубликуйте ответ как ответ, чтобы вопрос не отображался с 0 ответами, даже если он был решен. Если никто не сделает в течение часа, я сделаю.   -  person xaxxon    schedule 10.06.2013
comment
@JMcMinn, если он все еще ошибается, запрос, вероятно, не является допустимым указателем или он не завершается нулем.   -  person xaxxon    schedule 10.06.2013
comment
char returncode[80] — локальная переменная. и char *req = "user:serv:5:8:1:user:serv:secret1"; только для чтения в большинстве случаев.   -  person BLUEPIXY    schedule 10.06.2013
comment
Да, я понимаю... C - это такая боль для того, кто никогда не учил его должным образом XP   -  person JMcMinn    schedule 11.06.2013


Ответы (2)


Ответ был найден в комментариях: мне не хватило #include <string.h> вверху файла.

РЕДАКТИРОВАТЬ: я должен добавить, что были и другие проблемы, помимо упомянутой выше. Во-первых, saveptr должен быть инициализирован нулем. Во-вторых, как указал BLUEPIXY, returncode[] была локальной переменной. Заменено его определение на char *returncode = malloc ( . . . );

person JMcMinn    schedule 10.06.2013

Это можно удалить, используя заголовочный файл «string.h» в C.

person Ambika    schedule 15.08.2014
comment
Вы имеете в виду #include <string.h>, как описано в принятом ответе? - person Simon MᶜKenzie; 15.08.2014