【问题标题】:c - passing char into strtok?c - 将 char 传递给 strtok?
【发布时间】:2012-11-12 06:25:53
【问题描述】:

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

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

  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];                  
 };

【问题讨论】:

标签: c strtok


【解决方案1】:

你没有。 Strtok 可能不是您尝试做的事情的正确解决方案,而且您似乎误解了它的作用。 strtok 的 delim 参数实际上是一组字符,表示为字符串。 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

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-26
      • 2019-02-07
      • 2018-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      相关资源
      最近更新 更多