Я пытаюсь токенизировать строку в 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
#include <string.h>
. Но вы также должны компилировать с-Wall -Werror
, так как это сказало бы вам об этом... - person Oliver Charlesworth   schedule 10.06.2013-Werror
просто превращает все предупреждения в ошибки, препятствуя успешной компиляции. Это очень полезно! Я также рекомендую-Wextra
. - person Oliver Charlesworth   schedule 10.06.2013-Wall
. См. gcc.gnu.org/onlinedocs/gcc/Warning-Options. .html#Warning-Options для получения полного списка флагов, которые вы можете использовать. - person Oliver Charlesworth   schedule 10.06.2013char returncode[80]
— локальная переменная. иchar *req = "user:serv:5:8:1:user:serv:secret1";
только для чтения в большинстве случаев. - person BLUEPIXY   schedule 10.06.2013