1

在下面的代码行中,我尝试将键字符串替换为在字符串中找到的变量字符串。例如,如果我有一个字符串“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*。

更简单的表达方式:如何将 char 数组中的单个字符(用户输入,因此不能硬编码)作为 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];                  
 };
4

2 回答 2

3

你没有。Strtok 可能不是您尝试做的事情的正确解决方案,而且您似乎误解了它的作用。to的delim参数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!isalnum

于 2012-11-12T07:00:51.880 回答
0

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

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

2.记得用'\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
于 2012-11-12T06:44:04.903 回答