【问题标题】:strtok_r causing "assignment makes pointer from integer without a cast"strtok_r 导致“赋值使指针从整数不进行强制转换”
【发布时间】:2013-06-05 14:41:24
【问题描述】:

我正在尝试在 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' 是一个以冒号分隔的标记字符串。当我尝试编译时,在我分配一个字符串的每一行上,我都会得到“赋值使指针从没有强制转换的整数”。由于 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

【问题讨论】:

  • 应该没问题 (ideone.com/Dty4x7);你需要发布一个完整的测试用例。
  • 你忘了#include &lt;string.h&gt;。但你也应该使用-Wall -Werror 进行编译,因为那会告诉你这件事......
  • 拍脑门 谢谢。我有一种感觉,它会是这样的。我正在使用 -Wall 进行编译,但我想我现在必须添加 -Werror。
  • -Werror 只会导致所有警告变成错误,从而阻止编译成功。它非常有用!我也推荐-Wextra
  • 我明白了,谢谢。 -Wextra 是做什么的?

标签: c string variable-assignment strtok


【解决方案1】:

这可以通过使用 C 中的“string.h”头文件来删除

【讨论】:

【解决方案2】:

在 cmets 中找到答案:我在文件顶部缺少#include &lt;string.h&gt;

编辑:我应该补充一点,除了上述问题之外,还有其他问题。首先,saveptr 应该初始化为 null。其次,正如 BLUEPIXY 指出的那样,returncode[] 是一个局部变量。将其定义替换为char *returncode = malloc ( . . . );

【讨论】:

    猜你喜欢
    • 2011-06-23
    • 1970-01-01
    • 2011-01-05
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多