使用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;
}
html
发现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',这样才能得到字符串实际的长度。

最后我去掉测试的代码。
cpp
运行
#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; }
成功运行!

总结:有些时候偷懒不是什么好事。
网址:使用strlen()函数返回的长度错误的总结 https://www.yuejiaxmz.com/news/view/1456188
相关内容
sum函数的使用方法及实例 sum函数的使用方法【使用Hash表实现英文单词表并实现单词查询操作:给定单词查询其英文翻译:(1)构造用于存放英文单词表的散列表结构:定义Hash函数;使用开散列法处理冲突;(2)英文单词表在附件文】
vba 编译错误?缺少:=??VBA函数需不需要括号
index match函数的使用方法
pos函数的使用
【数据分析】15组Excel函数,解决数据分析中80%的难题!
EXCEL函数LookUp, VLOOKUP,HLOOKUP应用详解(含中文参数解释)
【C++ 函数设计的艺术】深挖 C++ 函数参数的选择 智能指针与 std::optional:最佳实践与陷阱
毕设拯救计划(一)基于FreeRTOS的智能家居(STM32+Onenet云)
效率工具:数据分析中常见的Excel函数都在这里了

