将字符串(逐个字符)插入更大的字符串

时间:2016-11-17 19:52:07

标签: c arrays

我试图通过用新字符串(toInsert)替换(原始)字符串中的子字符串来插入字符串。 start参数是我要替换的子字符串的起始位置。注意:这是较大程序的一部分,但我只是想让这个功能起作用。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ROW 5
#define COLUMN 81

void insertString(char original[], int start, int length, char toInsert[]){

char buffer[COLUMN];
int i = 0;

for (i=0; i<strlen(original); ++i){
    if (i>=start){
        buffer[i] = toInsert[i];
    }
    else{
        buffer[i] = original[i];
    }
}

buffer[strlen(buffer)-1] = '\0';



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



return;
}

int main()
{
char rep[COLUMN] = "very";
char sub[COLUMN] = "are";

char buf[ROW][COLUMN] = {
    {"How are you doing"}


};
int len = strlen(sub);
int start = 4;

insertString(buf[0], start, len, rep);



return 0;
}

问题是它只打印&#34;如何&#34;。

我想要打印&#34;你做得多好&#34;

另外,我尝试过使用strcpy,但是只是提供错误/警告(与指针有关,我不想处理指针,因为我还没有了解它们。)

1 个答案:

答案 0 :(得分:1)

你的功能没有多大意义,因为它既不会扩大或缩小原始字符串,但必须这样做。

此外,由于此if语句,它具有未定义的行为,因为当i等于或大于start时,您可以使用索引{{toInsert访问字符串i以外的内存。 1}}。

if (i>=start){
    buffer[i] = toInsert[i];
}

使用标准C函数编写函数更简单。

你在这里

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

char * replaceString( char *s1, size_t pos, size_t n, const char *s2 )
{
    size_t n1 = strlen( s1 );

    if ( pos < n1 )
    {
        size_t n2 = strlen( s2 );

        if ( n != n2 )
        {

            memmove( s1 + pos + n2, s1 + pos + n, n1 - pos - n + 1 );
        }

        memcpy( s1 + pos, s2, n2 );
    }

    return s1;
}


int main(void) 
{
    {
        char s1[100] = "ab1111cd";
        const char *s2 = "22";

        puts( replaceString( s1, 2, 4 , s2 ) );
    }

    {
        char s1[100] = "ab11cd";
        const char *s2 = "2222";

        puts( replaceString( s1, 2, 2 , s2 ) );
    }

    {
        char s1[100] = "ab11cd";
        const char *s2 = "22";

        puts( replaceString( s1, 2, 2 , s2 ) );
    }

    return 0;
}

程序输出

ab22cd
ab2222cd
ab22cd

如果要插入此代码块

{
    char s1[100] = "How are you doing";
    const char *s2 = "very";

    puts( replaceString( s1, 4, 3 , s2 ) );
}

在示范程序中,您将获得输出

How very you doing