c-将字符传递到strtok?
在下面的代码行中,当在字符串中找到变量字符串时,我尝试将中的键字符串替换为变量字符串。例如,如果我有一个字符串“hello-VARIABLE-world”,则键值将取代变量值,使字符串“hello-KEY-world”代替原始字符串。我的理论是将字符串标记化为变量的第一个字符(字符串中)(newfirst),将变量字符标记化(newtrash),然后将字符串的其余部分标记化(newsecond)。然后将newfirst+key+newsecond合并。问题是,myVariables[i]。变量[0]和myVariables[i]。变量[varlength-1]正在前两行中以字符的形式读入strtok函数,并且编译器正在请求常量字符*。知道如何在strtok函数中格式化这些字符串的第一个和最后一个值吗 更简单的表达方式:如何从字符数组(用户输入,因此不能硬编码)传递单个字符作为strtok函数中的删除字符 **要明确的是,这不是整个计划,只是问题的关注点c-将字符传递到strtok?,c,strtok,C,Strtok,在下面的代码行中,当在字符串中找到变量字符串时,我尝试将中的键字符串替换为变量字符串。例如,如果我有一个字符串“hello-VARIABLE-world”,则键值将取代变量值,使字符串“hello-KEY-world”代替原始字符串。我的理论是将字符串标记化为变量的第一个字符(字符串中)(newfirst),将变量字符标记化(newtrash),然后将字符串的其余部分标记化(newsecond)。然后将newfirst+key+newsecond合并。问题是,myVariables[i]。变量[
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
不是答案。可以节省您的调试时间