概述
头文件string.h里有个strlen函数相信大家都不陌生,都觉得自己会用,但是有时也会坑了自己。举个例子
#include<stdio.h>
#include<string.h>
int main(){
for(int i=0;i<-1;i++)
printf("succeed");
return 0;
}
这个函数运行好是没结果的,再看下面一个
#include<stdio.h>
#include<string.h>
int main(){
char s[]="23";
char t[]="1";
printf("%dn",strlen(t)-strlen(s));
for(int i=0;i<strlen(t)-strlen(s);i++)
printf("succeed");
return 0;
}
这个主函数运行起来如果不关掉可能要一些时间
问题来了,strlen(t)-strlen(s)=-1,和第一个程序如出一辙,为什么结果差这么多?
我去查了一下strlen这个函数,发现他的返回值是unsigned int,就是无符号整型(通俗说就是非负整数),两个无符号整型相减得到负数,但是我们平常打印出来都是-1【例如:printf("%d",strlen(t)-strlen(s))】,这就和我的一些习惯有关系了,我一直把无符号整型当整型用,毕竟字符串长度怎么会是负数。
但实际上,正确打印无符号整型的语句应该是【printf("%u",strlen(t)-strlen(s))】,而这样的结果就是4294967295【unsigned int的最大值】。
这下就能解释通了,【for(int i=0;i<strlen(t)-strlen(s);i++)】这个语句里,先运算strlen(t)-strlen(s),因为这两个都是无符号整型,所以结果的类型就是无符号整型,也就是4294967295,i的最大值是2147483647,再加1就变成-2147483648,所以会一直循环下去。
这个事告诉我,要时常留意使用的函数的返回值的类型,不然哪会在这里翻了船,用【printf("%d",strlen(t)-strlen(s))】输出是-1,但是for循环却一直做,for里面一大堆代码,你怎么可能想得到是这里出了问题呢?
最后附张修改方案及结果图,欢迎交流:)
最后
以上就是哭泣大碗为你收集整理的C语言strlen使用误区【坑在for循环语句】的全部内容,希望文章能够帮你解决C语言strlen使用误区【坑在for循环语句】所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复