在下面的代码行中,我试图在字符串中找到变量字符串时替换键字符串。例如,如果我有一个字符串“hello VARIABLE world”,KEY值将代替VARIABLE值,使字符串“hello KEY world”而不是原始字符串。我的理论是将字符串标记为变量的第一个字符(在字符串中)(newfirst),标记化变量字符(newtrash),然后标记字符串的其余部分(newsecond)。然后连接newfirst + key + newsecond。问题是,myVariables [i] .variable [0]和myVariables [i] .variable [varlength - 1]正在读取前两行中的strtok函数的字符,并且编译器要求使用const char *。任何想法如何格式化这些字符串的第一个和最后一个值在strtok函数中工作?
简单地解释一下:如何从char数组中传递单个字符(用户输入,因此不能硬编码)作为strtok函数中的deliminator字符?
**要明确这不是整个程序,只是对问题的关注线
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];
};
答案 0 :(得分:3)
你没有。对于你想要做的事情,Strtok可能不是正确的解决方案,你似乎误解了它的作用。 delim
的{{1}}参数实际上是一个字符集,表示为字符串。 strtok
扫描输入字符串,直到它找到分隔符字符串中的任何单个字符并认为是分隔符的开头。然后它会查找在分隔符字符串中的任何位置的其他字符,并将它们视为分隔符。
现在它根本不清楚你要做什么,但看起来你正在搜索子串strtok
并用其他字符串替换它。 VARIABLE
可能就是你想要的。类似的东西:
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
答案 1 :(得分:0)
这不是解决问题的最佳方法:
1.declare指针并将你的第一个或最后一个字符传递给它。
2.member以'\ 0'结束它以使其可解析为const char。
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