今天学习希尔排序时,发现使用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; }
成功运行!
总结:有些时候偷懒不是什么好事。