将字符串中的char替换为C中的另一个字符串

CYB*_*B3R 0 c string char strcpy strncpy

我正试图在C中替换' '(空格)'___'(三重下划线).

这是我的代码:

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

int main()
{
   char *a = "12 34 56";
   int a_l = strlen(a);
   printf("str1: \"%s\" (%d)\n", a, a_l);

   char *b = "___";
   int b_l = strlen(b);
   printf("str2: \"%s\" (%d)\n", b, b_l);

   for (int i = 0; i < a_l; i++) {
      if (a[i] == ' ') {
         char *o = malloc(a_l + b_l);

         strncpy(o, a, i);
         strncpy(o + i, b, a_l);
         //strncpy help

         printf("out:  \"%s\"\n", o);
      }
   }

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我认为到目前为止它是正确的,但我需要用正确的替换注释行strncpy(取其余的字符串a(不包括空格)并将其附加到字符串o).所以输出应该是这样的:

str1: "12 34 56" (8)
str2: "___" (3)
out:  "12___34 56"
out:  "12 34___56"
Run Code Online (Sandbox Code Playgroud)

如果我的代码中有其他错误,请告诉我.

UPD:这不应该替换循环中的所有空格.如果源字符串包含8个空格,则应打印8行,并且每行中只应替换一个空格.

小智 6

你太复杂了,我只是TL; DR.

一些评论,你可能 肯定想要阅读,学习,拥抱和使用:

int不是为了字符串长度和东西.size_t用于字符串长度和东西.

II.字符串文字不能被修改,因此使用遗留char *类型将它们分配给变量无论如何都不利于 - const限制那个糟糕的指针基类型.

III.malloc()如果不真正需要动态内存管理(我们不再生活在1989年),请使用VLA而不是.

IV.NUL - 终止你的字符串,因为C stdlib例程希望你这样做.

int main()
{
    const char *in = "foo bar baz";
    int nspc = 0;

    for (const char *p = strchr(in, ' '); p; p = strchr(p + 1, ' '))
        nspc++;

    char buf[strlen(in) + nspc * 2 + 1];
    memset(buf, 0, sizeof(buf));

    const char *s = in;
    for (const char *p = strchr(s, ' '); p; p = strchr(s, ' ')) {
        strncat(buf, s, p - s);
        strcat(buf, "___");
        s = p + 1;
    }

    const char *end = in + strlen(in);
    strncat(buf, s, end - s);

    printf("%s\n", buf);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)