4

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...

「request」は、コロンで区切られたトークンの文字列です。コンパイルしようとすると、文字列の 1 つを割り当てる各行で「代入はキャストなしで整数からポインターを作成します」と表示されます。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
4

2 に答える 2

10

コメントで回答が見つかりました:#include <string.h>ファイルの先頭に行方不明でした。

編集:上記以外の問題があったことを付け加えておきます。まず、saveptrnull に初期化する必要があります。第二に、BLUEPIXY が指摘したようreturncode[]に、ローカル変数でした。その定義を次のように置き換えましたchar *returncode = malloc ( . . . );

于 2013-06-10T01:20:33.983 に答える