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

时间:2013-06-30 20:48:48

标签: 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;
}

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

o

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

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

6 个答案:

答案 0 :(得分:6)

你太过于复杂,我只是TL; DR。

有些评论说 肯定 想要阅读,学习,拥抱并使用:

予。 int不适用于字符串长度和内容。 size_t用于字符串长度和内容。

II。字符串文字无法修改,因此使用遗留char *类型将它们分配给变量无论如何都无济于事,const - 限定了糟糕的指针基类型。

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

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;
}

答案 1 :(得分:2)

你可以尝试这个。问题来自于malloc中的a_l + b_l始终是相同的值。它不受空格数的影响。

int count = 0, index = 0;
for (int i = 0;  i < a_l;  ++i) {
    if (a[i] == ' ') {
        count++;
    }
}

const char *o = malloc(a_l + 2 * count + 1); // 2 is because you add 3 new symbols, but remove 1 so 3 - 1 = 2
memset(o, 0, sizeof(o));

for (int i = 0;  i < a_l;  ++i) {
    if (a[i] != ' ')
        o[index++] = a[i];
    else {
        o[index++] = '_';
        o[index++] = '_';
        o[index++] = '_';
    }
}

答案 2 :(得分:1)

  

不使用库函数!!!

while(*string)
        {
                  if(*string=='\\')
                {
                        *string++;
                        while(repl_len--)
                         *dest++ = *repl_string++;
                }               
                else
                {
                        *dest++ = *string++;
                }
           repl_string = temp_repl_string;
           repl_len = temp_repl_len;    
        }

答案 3 :(得分:0)

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

size_t my_strlen(const char *str, size_t *spc){
    size_t len;
    *spc = len = 0;
    while(*str){
        ++len;
        if(*str++ == ' ')++*spc;
    }
    return len;
}

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

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

   char *p, *o = malloc(a_l - spc + spc * b_l + 1);
   p=o;
   for (int i = 0; i < a_l; i++) {
      if(a[i] == ' ') {
         strncpy(p, b, b_l);
         p += b_l;
      } else {
         *p++ = a[i];
      }
   }
   *p = '\0';
   printf("out:  \"%s\"\n", o);
   free(o);
   return 0;
}

答案 4 :(得分:0)

我看到已经添加了很多答案,但这可能只需要一个循环即可完成。由于字符串很短,你可以牺牲CPU上的内存并分配一个比原始字符串大3倍的数组,并确保它不会溢出:

const char* string= "12 34 56";
size_t length= strlen(string);
char result[length*3 +1];
unsigned int index= 0;
memset(result, '\0', length*3+1);
for(int i=0; i<length; i++)
{
    if(string[i]!= ' ')
    {
        result[index++]= string[i];
    }
    else
    {
        strcat(result,"___");
        index+= 3;
    }
}

答案 5 :(得分:0)

我找到了另一个thread,在看完答案后,我发现右边的行应该是这样的:

strncpy(o + i + b_l, a + i + 1, a_l - i);

在此线程中建议的一些修复后,我的代码如下所示:

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

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

   char *b = "___";
   size_t 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);
         strcpy(o + i, b);
         strncpy(o + i + b_l, a + i + 1, a_l - i);

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

   return 0;
}

然后打印出所需的输出。