c和指针 又一个题目 <感觉自己很笨,代码写的很繁琐,而且传入参数为'\0'时,程序直接崩溃了>
程序代码:
#include <stdio.h> /* c和指针习题二: 函数首先应该判断substr是否在str中,如果它并未出现 则返回0 如果出现了,则函数应该把str中位于该子串后面的所有字符复制 到该子串位置,然后返回1,如果substr多次出现于str中,则后面 的被忽略,也就是只有第一个被覆盖,函数的第二个参数绝对不能 被修改。 要求1、要使用指针操作字符串而不是使用数组下标 要求2、不能使用已知的库函数操作字符串 提示1、空字符串是每个字符串的子串,也就是说如果第2个参数是 空字符串 则源串不发生变化 */ int del_substr(char* str,const char* substr) { /* if(*substr=='\0') //这个比较会导致程序崩溃 { return 0; } */ int i=0,j; int s_len=0; int sub_len=0; bool flag=true; //标记子串是否在源串中 char* p_s=str; //临时指针 const char* p_sub=substr; //临时指针 while(*p_s!=NULL) { s_len++; *p_s++; } //计算源串长度 while(*p_sub!=NULL) { sub_len++; *p_sub++; } //计算子串长度 p_sub=substr; p_s=str; if(sub_len>=s_len) return 0; //如果子串长度大于等于源串长度 直接返回 while(i<s_len-sub_len) { for(j=0;j<sub_len;j++) //这个循环用于判断子串是否在源串之间被包含 { if(*p_s!=*p_sub) { flag=false; break; } *p_s++; *p_sub++; } if (flag==true) //下面几句代码实现的是子串后面的串向前移动 { char* p_tmp=str+sub_len; for(j=0;j<s_len-sub_len-i;j++) { *str=*p_tmp; str++; p_tmp++; } *str='\0'; return 1; } i++; //下面几句也是用于用于判断子串是否在源串之间被包含 if(i!=s_len-sub_len) flag=true; p_sub=substr; p_s=++str; //一个一个的移动源串指针 用于用于判断子串是否在源串之间被包含 } return 0; } int main(void) { char a[]="abcdefgfgjldk"; //看起来这个只能用数组传入了,否则无法移动子串 //那么前一道题目如果用数组传入 将会变得很简单 char* b="1234"; char* c="def"; char* d='\0'; int i=0,j=0; //i=del_substr(a,b); j=del_substr(a,c); //这个语句可以测试成功 printf("%s\n",a); //j=del_substr(a,d); //这个语句无法测试成功 //printf("%s\n",a); return 0; }