如何用一个字符替换多字符字符常量

时间:2019-05-08 16:32:57

标签: c string

我正在尝试用C中的'%7C'替换'|',但是却收到了多字符常量警告。我想知道是否有可能这样做?我试图使用下面的代码,但它给出了警告。

Parse.c

char *parse(char *command){
 char * newCommand = (char *)malloc(sizeof(char)*35);
     newCommand = strtok(command, " ");
     newCommand = strtok(NULL, "/run?command= ");
     for(int i = 0; i<strlen(newCommand); i++){
          if(newCommand[i] == '+')
          {
              newCommand[i] = ' ';
          }
          if(newCommand[i] == '%7C')
          {
               newCommand[i] = '|';
          }
     }
    return newCommand;
  }

1 个答案:

答案 0 :(得分:2)

多字符常量不可移植,通常应避免使用。您的代码属于“常规”类别。

您的问题的部分解决方案是进行字符串比较(使用strncmp):

if (strncmp(&newCommand[i], "%7C", 3) == 0)
{
    newCommand[i] = '|';
}

但是,您还需要删除7C。这需要进行更多的手术:

int tgt = 0;
int len = strlen(newCommand);
for (int src = 0; src < len; src++)
{
    if (newCommand[src] == '+')
    {
        newCommand[tgt++] = ' ';
    }
    else if (strncmp(newCommand[i], "%7C", 3) == 0)
    {
        newCommand[tgt++] = '|';
        src += 2;
    }
    else
        newCommand[tgt++] = newCommand[src];
 }
 newCommand[tgt] = '\0';

这会将两个索引维护到newCommand数组中,一个索引从您正在读取(src),另一个从您正在写入(tgtdst将是一个备用名称)。将src += 2;替换为7C后,%会跳过|

未编译的代码!

此外,在您的职能中,您具有:

char *newCommand = (char *)malloc(sizeof(char)*35);
newCommand = strtok(command, " ");

这立即泄漏分配的内存。也许您需要使用strdup()或:

char *newCommand = malloc(strlen(command) + 1);
if (newCommand == NULL) …report error and bail out…
strcpy(newCommand, command);

以及下一行:

newCommand = strtok(NULL, "/run?command= ");

分割常量字符串中任何字符的任何序列;它不查找该字符串。如果要查找字符串,则需要strstr(),并且首先需要运行strtok(),以获取正确的起点(也许是newCommand = strtok(NULL, ""),然后是{{ 1}} —检查返回的空指针。

使用修改后的分配,您需要一个新符号来记录char *end = strstr(newCommand, "/run?command= ");返回的指针,例如strtok()

总而言之,您的代码需要做很多工作。