C和指针 学习(一)第六章第二题
编写一个函数,删除一个字符串的一部分。函数原型如下:
int del_substr(char * str, char const * substr)
需要注意的点:
1、注意指针的左值与右值区别;
2、满足题目要求:1、出现多次只删除第一次出现的substr;2、不应该使用任何操纵字符串的库函数;3、不应该使用下标引用;
3、注意原型要求,substr为指向字符常量的指针,不能和普通指针相转化。
方法一:不借助自定义对比函数:
int del_substr2(char *str, char const *substr){
if (str == NULL || substr == NULL)
return 0;
char * s1 = NULL;
while (*str != '\0')
{
int nLenth = 0;
s1 = str;
while (*s1 != '\0' && *substr != '\0' && *s1 == *substr){
nLenth++;
s1++;
substr++;
}
if (*substr == '\0'){ //全匹配的标志
s1 -= nLenth;
while(*(s1 + nLenth) != '\0'){
*s1 = *(s1 + nLenth);
s1++;
}
*s1 = '\0';
return 1;
}
else{
substr -= nLenth;
}
str++;
}
return 0;
}
方法二:借助一个判别是否有子串的函数: int substrcmp(const char *source, const char *str) {
if (source == NULL && str == NULL) {
return 0;
}
int len = 0;
for (;*source != '\0' && *str != '\0';++source, ++str) { // 两个字符串都没有结束
if (*source != *str) { // 两个字符串内容不相同
return 0; // 返回0
}
++len;
}
if (*str != '\0') { // 子字符串未遍历结束
return 0; // 返回0
}
return len; // 两个字符串相等,返回相等长度
}
// 删除str中substr部分
int del_substr1(char *str, const char *substr) {
if (str == NULL || substr == NULL) {
return 0;
}
int len = 0;
int count = 0;
while(*str!= '\0'){
len = substrcmp(str, substr);
if (len){
while(*(str + len) != '\0'){
*str = *(str + len);
str++;
}
*str = '\0';
return 1;
}
str++;
}
return 0;
}
浙公网安备 33010602011771号