功能:编写函数void fun(char *str,char ch)从字符串str中删除指定的字符ch。 要求:本问题要求用两种算法分别实现,一是直接删除算法即查找符合删除条件的并逐次前移实现;二是间接删除算法即查找不符合删除条件的并保留下来,而保留的方法可以采用利用本数组和引入临时数组两种实现。 说明:该字符可能多次和连续出现,算法应全面考虑。
时间: 2024-02-19 17:02:36 浏览: 180
一维字符数组大小写转换及字符与数字转换.pdf
好的,我可以为您解答这个问题。
第一种算法,直接删除算法可以按照如下步骤实现:
1. 使用两个指针i和j,i指向原字符串的起始位置,j指向修改后的字符串的起始位置。
2. 遍历原字符串,若当前字符不为待删除字符,则将该字符复制到修改后的字符串中,并将j指针向后移动一位。
3. 若当前字符为待删除字符,则i指针向后移动一位,j指针不动,跳过该字符。
4. 循环执行步骤2和步骤3,直到遍历完整个原字符串。
5. 将修改后的字符串末尾置为'\0'。
具体实现代码如下:
```c
void fun(char *str, char ch) {
int i = 0, j = 0;
while (str[i] != '\0') {
if (str[i] != ch) {
str[j] = str[i];
j++;
}
i++;
}
str[j] = '\0';
}
```
第二种算法,间接删除算法可以按照如下步骤实现:
1. 使用一个临时数组temp,将不需要删除的字符复制到temp中。
2. 将temp数组中的字符复制回原字符串中。
3. 将修改后的字符串末尾置为'\0'。
具体实现代码如下:
```c
void fun(char *str, char ch) {
int i = 0, j = 0;
char temp[strlen(str)+1];
while (str[i] != '\0') {
if (str[i] != ch) {
temp[j] = str[i];
j++;
}
i++;
}
temp[j] = '\0';
strcpy(str, temp);
}
```
需要注意的是,第二种算法需要开辟额外的临时数组,可能会占用更多的内存空间。
阅读全文