提交记录 #451
提交时间:2024-12-05 09:29:40
语言:c
状态:Unaccepted
编译情况:编译成功
code.c: In function ‘replaceSubstring’:
code.c:22:13: warning: unused variable ‘match’ [-Wunused-variable]
22 | int match = 1; // 假设匹配
| ^~~~~
code.c:41:13: warning: ‘strncpy’ output truncated before terminating nul copying as many bytes from a string as its length [-Wstringop-truncation]
41 | strncpy(ins, replacement, len_replacement);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
code.c:13:27: note: length computed here
13 | int len_replacement = strlen(replacement);
| ^~~~~~~~~~~~~~~~~~~
固定测试点#1:
固定测试点#2:
固定测试点#3:
附加测试点暂不可用
52【字符】字符替换*——用指针更方便
#include <stdio.h>
#include <string.h>
#define MAX_LEN 100
void replaceSubstring(char *source, const char *target, const char *replacement) {
char result[MAX_LEN * 2]; // 假设最坏情况下替换会使字符串长度翻倍(实际上可能不需要这么多)
char *ins = result; // 指向result的插入位置
const char *src;
char temp[MAX_LEN + 1]; // 用于临时存储source的副本,因为我们会修改source的内容
int len_target = strlen(target);
int len_replacement = strlen(replacement);
int increase = 0; // 记录由于替换导致的长度增加量
// 复制source到temp,因为我们会修改source的内容来存储最终结果
strcpy(temp, source);
src = temp;
while (*src) {
const char *tgt = target;
int match = 1; // 假设匹配
// 检查是否匹配target
while (*src && *tgt && (*src == *tgt)) {
src++;
tgt++;
}
if (*tgt == '\0') { // 完全匹配
// 计算需要增加的长度(替换串可能比被替换串长或短)
int len_diff = len_replacement - len_target;
// 检查替换后是否会超出result数组的长度
if (ins - result + len_replacement >= sizeof(result) - 1) {
// 如果超出,则截断(这里为了简单直接截断,实际应用中应添加错误处理)
break;
}
// 复制replacement到result
strncpy(ins, replacement, len_replacement);
ins += len_replacement;
// 更新由于替换导致的长度增加量
increase += len_diff;
// 移动src以跳过已匹配的部分
while (*src && (src - temp + increase < strlen(temp))) {
src++;
}
// 如果src已经到达字符串末尾,则退出循环
if (*src == '\0') {
break;
}
// 由于src可能由于increase而跳过了一些字符,我们需要重新检查当前字符
// 但是由于我们已经增加了ins,所以不需要再次复制当前字符到result
continue; // 跳过下面的*ins++ = *src++;
}
// 如果没有匹配,则复制当前字符到result
*ins++ = *src++;
}
*ins = '\0'; // 添加字符串结束符
// 将结果复制回source(注意:这里假设替换后的字符串长度不会超过source数组的大小)
// 在实际应用中,应该确保替换后的字符串长度不会超过source数组的大小,或者使用动态内存分配
if (strlen(result) <= MAX_LEN) {
strcpy(source, result);
} else {
// 如果替换后的字符串太长,则打印警告并只复制可安全复制的部分
printf("Warning: Replacement result too long, truncating.\n");
strncpy(source, result, MAX_LEN);
source[MAX_LEN] = '\0'; // 确保字符串以null结尾
}
}
int main() {
char s[MAX_LEN + 1];
char t[11];
char str[11];
// 读取输入
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'; // 去掉换行符
// 执行替换操作
replaceSubstring(s, t, str);
// 输出结果
printf("%s\n", s);
return 0;
}