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;
答案 0 :(得分:6)
在第一种情况下,将字符串文字传递给strtok()。由于strtok()修改了此字符串,并且由于字符串文字无法合法修改,因此最终会出现未定义的行为。在第二种情况下,编译器将字符串复制到数组中。数组内容可以修改,所以这段代码没问题。
答案 1 :(得分:2)
strtok
修改了第一个参数。
在您的情况1中,strtok
的参数是字符串literal
,无法修改,因此strtok
失败。但在案例2中,参数是一个可修改的char
数组,strtok
修改并分解为较小的字符串。
答案 2 :(得分:0)
这是一个代码,所有方面都应该是pateded。
如果我忘了什么,请给我一个提示
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#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'