C语言子串替换 附详细注释

初级题,大佬勿入~

这个题的难度主要在一些细节,要不要取等呀要不要加一呀,稍微一不留神哪里多一位少一位,整个结果就不对了

边敲代码编写注释、及时在草稿纸上举一个简单的实例确认这个地方要不要取等(而不是侥幸乱猜)、规范变量命名(能看出实际意义而不是用一堆意味不明的字母)都是好习惯!

题目:

请你编写一个字符串处理的函数,其功能是在字符串A中查找字符串B,并将A中出现的第一个B用字符串C替换,函数返回1;如果A中不存在字符串B则将字符串C连接到字符串A的后面,函数返回0。   

函数的定义如下:   

int replaceStr(char A[ ], const char B[ ], const char C[ ])   {   }

本题的框架代码如下,你只需将未完成的函数补充完成。

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <iostream>

#include <cstring>

using namespace std;

int replaceStr(char A[ ], const char B[ ], const char C[ ])

{

//补充代码,完成此函数

}

int main()

{

    char str1[110], str2[110], str3[110];

    int nRes;

    cin.getline(str1, 100);

    cin.getline(str2, 100);

    cin.getline(str3, 100);

    nRes = replaceStr(str1, str2, str3);

    printf("%d", nRes);

    printf("%s", str1);

    return 0;

}

输入格式

  3行,第一行字符串A,第2行字符串B,第3行字符串C

输出格式

  2行,第2行一个整数,输出replaceStr函数的返回值,第2行一个字符串,经过处理后的字符串A。

输入样例

Hello world!
world
baby

输出样例

1
Hello baby!

特殊提示

  输入字符串的长度不超过100。

代码(已ac):

(这家伙不会用C++诶 谅解一下菜鸟吧)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int replaceStr(char A[], const char B[], const char C[])
{ //在A中搜索B第一次出现的位置并且用C替换B
	int la, lb, lc;
	la = strlen(A);
	lb = strlen(B);
	lc = strlen(C);
	for (int i = 0; i <= la - lb; i++) {
		//最终确定下来的i就是A中B的首字母开始的index
		//i最大 对应着B在A的最末尾出现 注意取等
		int same = 0;
		for (int j = 0; j < lb; j++) {
			if (A[i + j] == B[j])
				same++;
		} //试探A从i开始的子串与B相同的位数为same
		if (same == lb) { //那么这一轮找到的i就是B开始的index
			if (lb > lc) { //如果B比C长
				for (int j = 0; j < lc; j++)
					A[i + j] = C[j];
				//把A中从i开始的lc个字符换成C
		
				for (int j = i; j < la - lb; j++)
					A[j + lc] = A[j + lb];
				/*把原来A中从i+lb开始的余下(总共la-lb-i个)字符
				放到现在A中从i+lc开始的位置*/

				A[la + lc - lb] = '\0';
			} 
			else { //如果B比C短 或者一样 就先保存A的后一段

				/*A的前i个字符是第一段 序号从i到i+lb-1的lb个字符是要被替换的
				* A的最后一段在原来的A中对应i+lb到la-1的(la-lb-i)个字符
				* 在新的A中,这一段起始字符的index为i+lc,终止为la-lb+lc-1
				* 这里一定要逆着操作!否则会有数值污染
				*/
				for (int j = la - lb - 1; j >= i ; j--)
					A[j + lc] = A[j + lb];

				A[la - lb + lc] = '\0';

				for (int j = 0; j < lc; j++)
					A[i + j] = C[j];
				//把C放到从i开始的lc个位置上
			}
			return 1;
		}
	} //如果找不到B,就把C连在A后面
	for (int i = 0; i < lc; i++)
		A[la + i] = C[i];
	A[la + lc] = '\0' ;
	return 0;
}

int main()
{
	char str1[200], str2[200], str3[200];
	int nRes;
	gets(str1);
	gets(str2);
	gets(str3);

	nRes = replaceStr(str1, str2, str3);
	printf("%d\n", nRes);
	printf("%s\n", str1);

	return 0;
}

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值