c-将字符传递到strtok?

c-将字符传递到strtok?,c,strtok,C,Strtok,在下面的代码行中,当在字符串中找到变量字符串时,我尝试将中的键字符串替换为变量字符串。例如,如果我有一个字符串“hello-VARIABLE-world”,则键值将取代变量值,使字符串“hello-KEY-world”代替原始字符串。我的理论是将字符串标记化为变量的第一个字符(字符串中)(newfirst),将变量字符标记化(newtrash),然后将字符串的其余部分标记化(newsecond)。然后将newfirst+key+newsecond合并。问题是,myVariables[i]。变量[

在下面的代码行中,当在字符串中找到变量字符串时,我尝试将中的键字符串替换为变量字符串。例如,如果我有一个字符串“hello-VARIABLE-world”,则键值将取代变量值,使字符串“hello-KEY-world”代替原始字符串。我的理论是将字符串标记化为变量的第一个字符(字符串中)(newfirst),将变量字符标记化(newtrash),然后将字符串的其余部分标记化(newsecond)。然后将newfirst+key+newsecond合并。问题是,myVariables[i]。变量[0]和myVariables[i]。变量[varlength-1]正在前两行中以字符的形式读入strtok函数,并且编译器正在请求常量字符*。知道如何在strtok函数中格式化这些字符串的第一个和最后一个值吗

更简单的表达方式:如何从字符数组(用户输入,因此不能硬编码)传递单个字符作为strtok函数中的删除字符

**要明确的是,这不是整个计划,只是问题的关注点

  strcpy(newfirst, strtok(testString, myVariables[i].variable[0]));
   strcpy(newtrash, strtok( NULL, myVariables[i].variable[varlength - 1]));
   strcpy(newsecond, strtok(NULL, "\n"));
   strcat(newfirst, myVariables[i].key);
   strcat(newfirst, newsecond);


  struct variablePairs {
     char variable[20];                 
     char key[20];                  
 };

这不是解决问题的最佳方法:

1.声明一个指针并将第一个或最后一个字符传递给它

2.记住以“\0”结尾,使其可解析为常量字符

3.在strtok中使用(const char*)p表单

char x[256]={0};
char *p;

p = malloc(2);
strcpy(x,"abcd");
*p = x[0];
memset(p+1,'\0',1);

printf("\n point p is %s\n",(const char *)p);
输出:

point p is a

你没有。Strtok可能不是您想要做的事情的正确解决方案,您似乎误解了它的作用。
strtok
delim
参数实际上是一组字符,表示为字符串
strtok
扫描输入字符串,直到找到delimeter字符串中的任何单个字符,并认为delimeter的开头。然后,它会查找delimeter字符串中任何位置的其他字符,并将它们视为delimeter

现在还不清楚您要做什么,但看起来您正在搜索一个子字符串
变量
,并用其他字符串替换它
strstr
可能就是您在这里想要的。比如:

if ((p = strstr(input, myVariables[i].variable))) {
    strncpy(output, input, p-input);
    strcat(output, myVariables[i].key);
    strcat(output, p+strlen(myVariables[i].variable));
} else {
    /* variable not found */
    strcpy(output, input);
}
这将找到变量字符串,即使它嵌入到另一个单词中——如果要避免这种情况,还需要检查匹配项,确保匹配项被空格包围或位于字符串末尾:

len = strlen(myVariables[i].variable);
if ((p = strstr(input, myVariables[i].variable)) &&
    (p == input || isspace(p[-1])) &&
    (isspace(p[len]) || p[len] == 0))

根据您处理数字和标点符号的方式,您可能希望将
isspace
调用替换为
!isalpha
!isalnum

不是答案。可以节省您的调试时间