先观看以下代码
#include<stdio.h>
void del_space(char *pa);
int main()
{
char arr[]="He ll o";
del_space(arr);
puts(arr); //输出Hello
}
void del_space(char *pa)
{
char *pb=pa;
while(*pa != '\0')
{
if(*pa == ' ')
{
pa++;
}
else
{
*pb=*pa;
pa++;
pb++;
}
}
*pb='\0';
}
首先先了解下puts函数,这个函数输出字符串时,若是读到‘\0’这个字符后会停止输出,所以单看这个代码的输出结果是没有错的,但若是将主函数中的puts更改为printf函数,也就是更改为以下代码输出
int i;
for(i=0;i<sizeof(arr)/sizeof(char);i++)
{
printf("%d ",arr[i]);
}
输出结果为:72 101 108 108 111 0 111 0
最后多的一个111是原字符串中arr[6]对应的字符'o',代码原理是通过两个指针去更改原字符串中内的值,将空格去掉之后修改后的字符串在'\0'前的有效字符会缩短,导致运行结束后字符数组中'\0'后面的字符没有被处理

所以严谨的话可以将此时指针pb后续的字符都赋值为’\0‘。
完整代码如下:
#include<stdio.h>
void del_space(char *pa,int mystrlen);
int main()
{
char arr[]="He ll o";
int len=sizeof(arr)/sizeof(char);
del_space(arr,len);
puts(arr);
int i;
for(i=0;i<sizeof(arr)/sizeof(char);i++)
{
printf("%d ",arr[i]);
}
}
void del_space(char *pa,int mystrlen)
{
char *pb=pa,*pc=pa;
while(*pa != '\0')
{
if(*pa == ' ')
{
pa++;
}
else
{
*pb=*pa;
pa++;
pb++;
}
}
while(mystrlen-(pb-pc)>0) //pb-pc表示的意思是两个指针之间相差的数据元数的个数
{
*pb='\0';
pb++;
}
}
运行结果为:

1934

被折叠的 条评论
为什么被折叠?



