我的任务是写一个字符串,然后写一个需要用另一个字符串替换的字符串的一部分。我设法让它工作,但如果被替换的字符串比需要替换的那部分字符串更长,它只是“吃掉”一些字母。我能帮忙完成这项任务吗? 工作代码示例:
输入:
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);
}
答案 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);
如果您添加的字符串小于要删除的子字符串,则会出现类似的问题。