在另一个中间添加新字符串 - c

时间:2016-06-08 15:12:31

标签: c string append

我的任务是写一个字符串,然后写一个需要用另一个字符串替换的字符串的一部分。我设法让它工作,但如果被替换的字符串比需要替换的那部分字符串更长,它只是“吃掉”一些字母。我能帮忙完成这项任务吗? 工作代码示例:

输入:

This is a beautiful day.
END

输入2:

a be

输入3:

not a bee

预期产出:

This is not a beeautiful day.

我的输出:

This is not a beeful day.

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX 1000

main(){
    char unos[MAX+1];
    int i = 0;
    char c;
    printf("Enter text. For end type END\n");
    while (1){
        scanf("%[^\n]%*c", unos, &c);
        i = strstr(unos, "END") - unos;
        if (i >= 0){
            unos[i] = '\0';
            break;
        }
    }
    char trazena_zamjena[MAX + 1] = "\0";
    char zamjena[MAX + 1];
    printf("Enter part that needs to be replaced : ");
    i = 0;
    do{
        scanf("%c", &trazena_zamjena[i]);
        if (trazena_zamjena[i] == '\n') {
            trazena_zamjena[i] = '\0';
            break;
        }
        i++;
    } while (trazena_zamjena[i] != '\n');
    printf("Enter replacing text : ");
    i = 0;
    do{
        scanf("%c", &zamjena[i]);
        if (zamjena[i] == '\n') {
            zamjena[i] = '\0';
            break;
        }
        i++;
    } while (zamjena[i] != '\n');
    int l = i;
    char *ptr;
    ptr = strstr(unos, trazena_zamjena);
    printf("pointer : %d %p", ptr, ptr);
    strncpy(ptr, zamjena, l);
    printf("%s\n", unos);
}

1 个答案:

答案 0 :(得分:0)

让我们忘记这样的结尾。 在C中使用字符串时,将'\0'终止的字符序列放在内存中。

假设您有以下字符串char * str = "string";,其地址为str。 使用

ptr = strstr(str, "i");

ptr值为str+3(字符'i'的地址) 因此,假设您尝试将'i'替换为"ae"

strncpy(ptr, "ae", 2);

会将'a'写在ptr所指向的地址('i')和'e'指向ptr + 1指向的地址处(此处) ,它是'n'的地址 如果替换的子字符串很小,则应该移动所有的followig字符。

您可以通过

修改代码的结尾
printf("pointer : %d %p", ptr, ptr);
int len_substr = strlen(trazena_zamjena);
if (l > len_substr)
  strncpy(ptr + l,  ptr + len_substr, strlen(ptr + len_substr));
strncpy(ptr, zamjena, l);

如果您添加的字符串小于要删除的子字符串,则会出现类似的问题。