使用c

时间:2018-02-06 22:15:01

标签: c string visual-studio

我需要从主电源字符串中删除子字符串"hello",现在我已将'x'替换为'ks',将'z'替换为'ts',因为我的作业被要求我要做的。但现在我想不出一种方法来删除子串"hello",我已经尝试使用memmove(),但之后printf打印"(null)"

我的代码:

#include <stdio.h>
#include <string.h>

void antikorso(char *dest, const char *src) {
    const char *p = src;
    int i;

    for (i = 0; *p != '\0'; i++, p++)
    {
        if (*p == 'x') {
            dest[i++] = 'k';
            dest[i] = 's';
        }
        else if (*p == 'z') {
            dest[i++] = 't';
            dest[i] = 's';
        }
        else
        {
            dest[i] = *p;
        }
    }

    dest[i] = '\0';
    printf("\n%s", dest);
    char c[10] = "hello";
    int j;
    while (dest = strstr(dest, c))
        memmove(dest, dest + strlen(c), 1 + strlen(dest + strlen(c)));

    printf("\n%s", dest);
}


int main(void)
{

     const char *lol = "yxi izexeen hello asd hello asd";
     char asd[1000];
     antikorso(asd, lol);
 }

1 个答案:

答案 0 :(得分:1)

你身边的逻辑错误。它会打印NULL,因为在您删除了"hello"后,条件就会出现 while循环再次被评估,这导致:

dest = strstr(dest, c);

最终会将NULL分配给dest,这就是您打印的内容。你需要 另一个记住原始字符串的变量。

char *original = dest;
char c[10] = "hello";
while (dest = strstr(dest, c))
    memmove(dest, dest + strlen(c), 1 + strlen(dest + strlen(c)));

printf("\n%s", original);

这将打印出没有"hello" s。

的行