我正在尝试用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;
}
答案 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
),另一个从您正在写入(tgt
— dst
将是一个备用名称)。将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()
。
总而言之,您的代码需要做很多工作。