提交记录 #449
提交时间:2024-12-05 09:18:42
语言:c
状态:Unaccepted
编译情况:编译成功
固定测试点#1:
固定测试点#2:
固定测试点#3:
附加测试点暂不可用
52【字符】字符替换*——用指针更方便
#include <stdio.h>
#include <string.h>
#define MAX_LEN 100
// 返回一个布尔值,表示替换是否成功
int replaceSubstring(char *source, const char *target, const char *replacement, char *result) {
char *ins = result;
const char *src, *tgt, *rep;
int len_tgt = strlen(target);
int len_rep = strlen(replacement);
int offset = 0; // 用于跟踪替换操作导致的字符串增长
for (src = source; *src != '\0'; ) {
tgt = target;
while (*src && *tgt && (*src == *tgt)) {
src++;
tgt++;
}
if (*tgt == '\0') {
for (rep = replacement; *rep != '\0'; ) {
if (ins - result + 1 + strlen(src) > MAX_LEN) {
// 如果替换后长度将超过 MAX_LEN,则返回 0 表示失败
return 0;
}
*ins++ = *rep++;
offset += len_rep - len_tgt; // 更新偏移量
}
src++;
} else {
if (ins - result + 1 + strlen(src) > MAX_LEN) {
// 如果剩余长度(包括当前字符和后续字符)将超过 MAX_LEN,则返回 0 表示失败
return 0;
}
*ins++ = *src++;
}
}
*ins = '\0';
strcpy(source, result); // 如果确定不会溢出,可以复制回去;否则,可以省略这一步
return 1; // 返回 1 表示成功
}
int main() {
char s[MAX_LEN + 1];
char t[11];
char str[11];
char result[MAX_LEN + 1 + 10]; // 额外预留一些空间以防替换导致字符串增长
// 读取输入
fgets(s, sizeof(s), stdin);
s[strcspn(s, "\n")] = '\0';
fgets(t, sizeof(t), stdin);
t[strcspn(t, "\n")] = '\0';
fgets(str, sizeof(str), stdin);
str[strcspn(str, "\n")] = '\0';
// 执行替换操作
if (replaceSubstring(s, t, str, result)) {
// 输出结果
printf("%s\n", result); // 使用 result 而不是 s 来避免潜在的溢出问题
} else {
printf("Error: Replacement would exceed the maximum length of the source string.\n");
}
return 0;
}