写这篇文章目的:自己在网上找的类似文章,发现大多少都是只考虑一种情况,比如开头替换,或中间替换等等,没有考虑全部情况,所以自己写了一篇考虑情况多的。
描述:
用一个新单词,替代给定字符串中指定的任意位置的单词。
输入:
输入包括3行
第一行输入一个字符串,要求每个单词之间有空格。
第二行输入要替换的单词。
第三行要求输入替换的新单词。
输出
直接输出替换后的字符串
样例:
输入:
it is a good
good
student
输出:
it is a student
思想:找到替换的单词后,把替换的单词的前后字符串分别存入新的数组中,之后进行整体拼接即可,难点在于条件的考虑。
代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
//用一个单词替换给定字符中的某个单词
//思想:准备两个数组,第一个数组存储要替换的单词前面的字符串,把新单词插到第一个字符串后面,第二个存储要替换单词的后面的字符串,最后拼接
int main() {
char text[100], word[20], replace[20];//text输入的一句英文话,word要替换的单词,replace新单词
char temp[100]="", temp1[100]="";//temp存储替换的单词前面的字符串,temp1存储替换的单词后面的字符串
int i, j, k,flag,t,p;//i记录的始终是要替换单词第一个字符的小标
printf("请输入字符串:");
fgets(text, sizeof(text), stdin);
printf(" 请输入要替换的单词:");
fgets(word, sizeof(word), stdin);
printf("请输入要替换的新单词:");
fgets(replace, sizeof(replace), stdin);
// 移除字符串末尾的换行符
text[strlen(text)-1] = '\0';
word[strcspn(word, "\n")] = '\0';
replace[strcspn(replace, "\n")] = '\0';
for (i = 0; text[i] != '\0'; i++) { //从字符串中依次遍历每个字符,找要替换的单词的第一个字符
flag = 1; //判断找要替换的单词是否成功
for (j = i, k = 0; word[k] != '\0'; j++, k++) {
//当找到第一个字符时,开始遍历看字符串中的字符是否等于要替换的单词
if (text[j] != word[k]) {
//如果不等于则退出继续寻找;如果找到,j代表替换单词最后一个字符下一个位置的下标
flag = 0;
break;
}
}
//在第一个for循环中成功找到单词,则开始替换
if (((flag == 1) && (text[i - 1] == ' '||i==0)&&(text [j]==' '||text[j]=='\0'))) {
//如果是字符串第一个单词,则i=0
//如果是中间的单词,则需要判断第一个匹配的字符的前一个位置是否为空格
//(text [j]==' '||text[j]=='\0'),为了防止,如果替换的单词是一个字符,但其它单词中可能有该字符,会导致替换错误,如果不符合这种情况,则重新寻找
//所以判断它的下一个字符是否为空,或者结束符(替换最后一个单词的情况)
for (t = j, p = 0; text[t] != '\0'&&p < 100; t++,p++){
//将替换的单词的后面的字符存入另一个数组中
//t记录匹配单词的最后一个字符的下一个小标;p代表temp1数组的下标
temp1[p] = text[t];
}
//printf("%s", temp1);
//替换,1、要替换的字符就在开头
if (i == 0) {
for ( t = 0; replace[t] != '\0'; t++) {
temp[t] = replace[t];
}
//将要替换的单词后面的字符串重新和前面的接上
for (int c = 0; c < strlen(temp1); c++) {
temp[t] = temp1[c];
t++;
}
}else{
//2.要替换的字符不在开头
for (t = 0; t <i; t++) {
//把替换的字符的前面的单词存入temp数组
temp[t] = text[t];
}
for (t = i, k = 0; replace[k] != '\0'; t++, k++) {
//把新单词放到替换的单词的前面的字符串数组的后面
temp[t] = replace[k];
}
strcat(temp, temp1);//最后拼接
}
}
}
if (flag == 0) {
printf("该字符串中没有该单词\n");
}
for(i = 0;i<strlen(temp);i++){
printf("%c", temp[i]);
}
}