Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何用一个字符替换多字符字符常量_C_String - Fatal编程技术网

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

C 如何用一个字符替换多字符字符常量,c,string,C,String,我试图用C中的“|”替换“%7C”,但收到一个多字符常量警告。我想知道是否有可能做到这一点,如果有,如何做到?我试图使用下面的代码,但它给出了此警告 Parse.c 多字符常量不可移植,通常应避免使用。您的代码属于“常规”类别 问题的部分解决方案是使用strncmp进行字符串比较: 但是,您还需要卸下7C。这需要更多的环手术: int tgt = 0; int len = strlen(newCommand); for (int src = 0; src < len; src++) {

我试图用C中的“|”替换“%7C”,但收到一个多字符常量警告。我想知道是否有可能做到这一点,如果有,如何做到?我试图使用下面的代码,但它给出了此警告

Parse.c


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

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

但是,您还需要卸下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';
这会立即泄漏分配的内存。可能您需要使用strdup或:

下一行:

newCommand = strtok(NULL, "/run?command= ");
拆分常量字符串中任意字符的任意序列;它不寻找那个字符串。如果要查找字符串,则需要使用strstr,可能需要首先运行strtok,以获得正确的起点,可能是newCommand=strtokNULL,然后是char*end=strstrnewCommand,/run?command=;-并检查返回的空指针

对于修改后的分配,您需要一个新符号来记录strtok返回的指针,例如char*token


总而言之,您的代码需要做大量的工作。

据我所知,'%7C'不是有效字符。这是一个由三个字符组成的字符串。原因是我正在实现一个HTTP服务器,当用户输入时,它会返回到%7cT,这是完全可以理解的。%7C是“|”字符的URL编码版本。但是,您需要意识到您正在用单个字符替换子字符串。这样做的逻辑将比简单的赋值更复杂。旁白::您正在不必要地分配内存并在下一行覆盖它,从而导致内存泄漏。@BretHasel是的,有一种方法可以做到这一点。它被称为非编码。如果您是自己实现的,则需要编写一个算法,用字符替换输入的子字符串。您只关心|字符,还是需要对所有可能的字符进行常规的非编码?
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';
char *newCommand = (char *)malloc(sizeof(char)*35);
newCommand = strtok(command, " ");
char *newCommand = malloc(strlen(command) + 1);
if (newCommand == NULL) …report error and bail out…
strcpy(newCommand, command);
newCommand = strtok(NULL, "/run?command= ");