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



我正在尝试用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的其余部分(不包括空格)并将其附加到字符串o)。所以输出应该是这样的:

str1: "12 34 56" (8)
str2: "___" (3)
out:  "12___34 56"
out:  "12 34___56"

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

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

你把这件事搞得太复杂了,以至于我只是TL;博士

可能肯定想要阅读、学习、接受并使用的一些备注:

I。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("%sn", buf);
    return 0;
}

你可以试试这个。问题在于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++] = '_';
    }
}

不使用库函数!!!

while(*string)
        {
                  if(*string=='\')
                {
                        *string++;
                        while(repl_len--)
                         *dest++ = *repl_string++;
                }               
                else
                {
                        *dest++ = *string++;
                }
           repl_string = temp_repl_string;
           repl_len = temp_repl_len;    
        }
#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 = '';
   printf("out:  "%s"n", o);
   free(o);
   return 0;
}

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

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

我找到了另一个线程,在阅读了答案后,我发现右边的行应该是这样的:

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

这会打印出想要的输出。

相关内容

  • 没有找到相关文章

最新更新