今天学习希尔排序时,发现使用strlen()函数返回的长度不正确,然后开始分析错误原因。
代码如下
int main()
{
char a[]={28,13,72,85,39,41,6,20};
int len =strlen(a);//设置断点
for(int j=0;j<8;j++)
printf("%d ",a[j]);
cout<<endl;
//int len=strlen(a);
ShellSort(a,8);
for(int j=0;j<8;j++)
printf("%d ",a[j]);
cout<<endl;
return 0;
}
发现len的值并非8
然后我就进行测试
根据360百科
//
strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个'\0',如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到'\0'停止。
char aa[10];cout<<strlen(aa)<<endl; //结果是不定的
char aa[10]={'\0'}; cout<<strlen(aa)<<endl; //结果为0
char aa[10]="jun"; cout<<strlen(aa)<<endl; //结果为3(此处不完全正确,结果可能是不定的,如果编译器将其他的非零字符串放在aa[10]的内存地址后,strlen结果还是不定的,MSP430在IAR编译测试过)(但是在vc6中结果为3,编译器会在"处自动添上\0。
//
我得出一个猜想,strlen(a),当a并非字符串数组时,编译有可能出错(不会自动在末尾加上\0)。
所以应该在末尾加上'\0',这样才能得到字符串实际的长度。
最后我去掉测试的代码。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
void ShellSort(char a[])
{
int len=strlen(a);
int s=len/2;
char temp;
for(int i=s;i>0;i=i/2)
{
for(int j=i;j<len;j++)
{
temp=a[j];
int k=j-i;
if(a[k]>a[j])
{
a[j]=a[k];
a[k]=temp;
}
}
}
}
int main()
{
char a[]={28,13,72,85,39,41,6,20,'\0'};
int len =strlen(a);
for(int j=0;j<8;j++)
printf("%d ",a[j]);
cout<<endl;
ShellSort(a);
for(int j=0;j<8;j++)
printf("%d ",a[j]);
cout<<endl;
return 0;
}
成功运行!
总结:有些时候偷懒不是什么好事。