使用strlen()函数返回的长度错误的总结

今天学习希尔排序时,发现使用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;
}


成功运行!



总结:有些时候偷懒不是什么好事。



猜你喜欢

转载自blog.csdn.net/qq_40830407/article/details/80279134