将字符串中的任意单个字符替换成指定的字符串_c语言

题目
将一串字符串中某个字符替换成特定的字符串;

例如:给定一个足够长的字符串"i am a student",将其中的空格字符替换成字符串"##??";

思路

应尽可能保证时间复杂度与空间复杂度保持在低位

尽可能不创建新的数组;
首先考虑是否可以在原数组中进行操作,由于是将字符串中某一特定字符替换为多个字符,如果直接替换可能导致原字符串中其它字符被覆盖,所以考虑从后向前进行筛选替换,将无需替换的字符直接后移一定位数,再将新替换字符串逐个打印替换即可。
主体

int main() {
	char str[NEM] = "i am a student";//原字符串
	char aim = ' ';//需要替换的字符
	char scr[] = "##??";//替换字符串
	replace(str,aim,scr);//将需要替换的字符串及替换对象传入替换函数
	printf("%s", str);
	return 0;
}

首先后移位数与需替换的字符数量有关,count记录需替换字符个数

size_t Getcount(char* str, char oldchar) {
	size_t count = 0;
	while (*str != '\0') {
		if (*str++ == oldchar) {
			count++;
		}
	}
	return count;
}

替换函数

void replace(char* str, char oldchar, char* scr) {
	size_t count = Getcount(str, oldchar);//统计str中需要替换的字符个数
	int i = strlen(str);//统计字符串有效字符个数,将i定位于字符串最后一位有效位数上
	int j = i + count * (strlen(scr) - 1);//将j定位于后置替换起点
	while (i > 0) {
		if (str[i] != oldchar) {
			str[j--] = str[i--];
		}
		else {
			for (int z = strlen(scr)-1; z >=0;j--,z--) {//此处应反向打印
				str[j] = scr[z];
			}
			i--;
		}
	}
}

结果

总结

本文中的时间复杂度和空间复杂度分别为O(n)和O(1);

要给定一个足够长的字符串否组替换时可能会出现越界现象

注意本题中i和j的取值。

源代码

#include<stdio.h>
#include<string.h>
#define NB  128

//将字符串中 某字符 替换为其它 字符串
size_t Getcount(char* str, char oldchar) {
	size_t count = 0;
	while (*str != '\0') {
		if (*str++ == oldchar) {
			count++;
		}
	}
	return count;
}

void replace(char* str, char oldchar, char* scr) {
	size_t count = Getcount(str, oldchar);//统计str中需要替换的字符个数
	int i = strlen(str);//统计字符串有效字符个数,将i定位于字符串最后一位有效位数上
	int j = i + count * (strlen(scr) - 1);//将j定位于后置替换起点
	while (i > 0) {
		if (str[i] != oldchar) {
			str[j--] = str[i--];
		}
		else {
			for (int z = strlen(scr)-1; z >=0;j--,z--) {//此处应反向打印
				str[j] = scr[z];
			}
			i--;
		}
	}
}

int main() {
	char str[NB] = "i am a student";//原字符串
	char aim = ' ';
	char scr[] = "##??";
	replace(str,aim,scr);//将需要替换的字符串及替换对象传入函数
	printf("%s", str);
	return 0;
}

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值