题目描述:
实现在字符串的内部删除字符串的函数del。函数原型如下: void del(char * s,int n,int len) ; 在s指向的字符串中,从s第n个字符的位置开始,删除len个字符,结果通过指针s返回。 n是从0开始,到s的长度-1为止。从0开始,len=s的字符串长度时,全部删除,原字符串为空字符串。 注意:使用空格字符来表示字符串的结束。 例如source指向位置,依次保存了字符'a',字符'b',字符空格' ',字符'c',则source指向的字符串为"ab"。 保存为functions.cpp。 遇到异常情况(s为null,n为负数等等),输出"error"; 否则不要随意输出,会视为错误。 例如:s为以空格结尾的字符串apple 调用del(s, 2, 2);之后,删除了数组下标以2开始的2个字符pl,结果为(以空格结尾) ape
参考代码:
#include<stdio.h>
void del(char * s,int n,int len)
{
if(s==NULL||n<0||len<0)
{
printf("error\n");
return ;
}
int i;
for(i=0;i<n+len;i++)
if(s[i]==' ')
{
printf("error");
return;
}
for(i=n;s[i+len]!='\0';i++)
s[i]=s[i+len];
for(;s[i]!='\0';i++)
s[i]=' ';
return ;
}
int main()
{
char s[1001];
int n,len;
scanf("%s %d %d",s,&n,&len);
del(s,n,len);
puts(s);
return 0;
}
讲解:
一道令人窒息的题目,一道百思不得其解的题目,一道提交n次、换了三种方法才过的题目!
字符串删除不难实现,只是要注意以空格结尾。
难就难在error情况。在自己调试时,含空格的字符串如果用scanf是没法实现的,所以若不仔细考虑,很难调试出这种情况。
在这里我们可以在main函数中字符串s定义时直接定义成含空格的字符串,例:“char s[1001]={"Iama string"};”。这样的话其真实长度应为4,但如果用strlen()或者while(s[i]!='\0')来计算长度是会得到11的。
这个错误情况本质就是 n+len>s的长度,但在这里,可以直接从第一个字符找到第n+len个字符,如果其中有空格,说明其真实长度小于n+len,可直接判断为error!
求实求真,大气大为。