strtok不接受:char * str

当使用char * str作为第一个参数(而不是分隔符字符串)时,strtok将无法正常工作。

它是否与以该表示法分配字符串的区域有关? (据我所知,这是一个只读区域)。

提前致谢

例:

//char* str ="- This, a sample string."; // <---doesn't work char str[] ="- This, a sample string."; // <---works char delims[] = " "; char * pch; printf ("Splitting string \"%s\" into tokens:\n",str); pch = strtok (str,delims); while (pch != NULL) { printf ("%s\n",pch); pch = strtok (NULL, delims); } return 0; 

在第一种情况下,您将字符串文字传递给strtok()。 由于strtok()修改了此字符串,并且由于字符串文字无法合法修改,因此最终会出现未定义的行为。 在第二种情况下,编译器将字符串复制到数组中。 数组内容可以修改,所以这段代码没问题。

strtok修改了它的第一个参数。

在你的情况1中, strtok的参数是一个字符串literal ,无法修改,因此strtok失败。 但在案例2中,参数是一个可修改的char数组, strtok修改并分解为更小的字符串。

这是一个代码,所有方面都应该是pateded。

  • 得到char指针
  • 使用strdup在strtok_r中使用char指针
  • 使用strtok_r是线程安全的
  • 免费结果strdup什么时候完成因为它使用malloc里面

如果我忘了什么,请给我一个暗示

 #include  #include  #include  #define WHITE " \t\n" // white space, tab and newline for tokenizing arguments #define MAXARGC 50 // max number of arguments in buf void handlecommand(int argc, char *argv[]) { // do some handle code, in this example, just print the arguments for(int i = 0; i < argc; i++) printf("argv[%d]='%s'\n", i, argv[i]); } void parsecommand(char * cmdstr) { char *cmdstrdup = strdup(cmdstr); if(cmdstrdup == NULL) //insuficient memory, do some errorhandling. return; char *saveptr; char *ptr; char *argv[MAXARGC]; int argc; if((ptr = strtok_r(cmdstrdup, WHITE, &saveptr)) == NULL) { printf("%s\n", "no args given"); return; } argv[argc = 0] = cmdstrdup; while(ptr != NULL) { ptr = strtok_r(NULL, WHITE, &saveptr); if(++argc >= MAXARGC-1) // -1 for room for NULL at the end break; argv[argc] = ptr; } // handle command before free handlecommand(argc, argv); // free cmdstrdup, cuz strdup does malloc inside free(cmdstrdup); } int main(int argc, char const *argv[]) { parsecommand("command arg1 arg2 arg3\targ4\narg5 arg6 arg7"); return 0; } 

结果

 argv[0]='command' argv[1]='arg1' argv[2]='arg2' argv[3]='arg3' argv[4]='arg4' argv[5]='arg5' argv[6]='arg6' argv[7]='arg7'