strlen函数的原理你都搞错了,其原型应该是这样的:int strlen(char *);它接受的是一个char*类型的参数,真不晓得你的这个是怎么传递进去的。 strlen计算字符串的长度例如"abc"的长度是3.但是实际上如果将其放到字符数组中的话,应该占4个元素。因为字符串是以字符'\0'结尾的,但是这个'\0'在我们的字符串是隐藏的,我们看不到。实际上是有的.例如:
char a[4]="abc";//这里数组的元素个数至少应该是4,否则此字符串不叫字符串了,只能叫字符数组了。
strlen判断一个字符串的结束就是以其末尾的'\0'为界限。其实现代码可以模拟为以下:
int strlen(char *p)
{
int i=0;
while(*p++)i++;
return i;
}
所以他是不包括'\0'这个字符的。
strlen函数所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含"\0")。
基本简介
原型:extern unsigned int strlen(char *s);,在Visual C++ 6.0中,原型为size_t strlen(const char *string);,其中size_t实际上是unsigned int,在VC6.0中可以看到这样的代码:typedef unsigned int size_t;
头文件:string.h
格式:strlen (字符数组名)
功能:计算字符串s的(unsigned int型)长度,不包括'\0'在内
说明:返回s的长度,不包括结束符NULL。
相关函数:
TCHAR.H routine _UNICODE & _MBCS not defined_MBCS defined_UNICODE defined_tcslen
程序举例
举例1:(在Visual C++6.0中运行通过)
#include
#include
int main(void)
{
char *s="Golden Global View";
printf("%s has %d chars",s,strlen(s));
getchar();
return 0;
}
首先要声明,strlen(xx[i])反回的值是0,因为你的xx还没有初值。你应该在readDat()的while循环中测试一下,是否读入了数据到xx数组中,在while中使用printf输出xx数组就知道了。应该是strlen反回0导至的错误。因为不了解你的那个dat文件中9近是什么内容,因此不好判断
程序主要错在第一个for语句for(j=1;j<(strlen(xx[i])-2);j=j+2)中的(strlen(xx[i])-2)这一句。
因为strlen()函数的反回类型为unsigned
int(无符号整型),因此再进行strlen(xx[i]-2的时候得到的是一个负数-2,而unsigned
int是无法表示负数的,因此就被计算机转换为补码的形式来表示-2了,,也就是十进制数的4294967292,二进制形式是11111111110(具体多少个1自已算,反正前面全是1)
你可以把strlen(xx[i])强制转换为int型来测试,比如(int)strlen(xx[i]-2这样的话就能得到正确结果了。
1.xx[2][8]的内存是连续分配的
2.
01234567
0dAe,BfC.
1CCbbAA\0
本来在第一行最后应该是\0的,但是位置占满了,所以\0就到第二行了(由于内存的连续分配)
但是继续向第二行写数据的时候,C就把第一行的\0覆盖了,到最后再加上第二的\0
而strlen只认起始字符d然后开始数,直到\0为止
所以把dAe,BfC.CCbbAA都数上了,数到第二行的\0结束,所以是14个
int是占两字节,因为是数组,分配的是3个int所以应该是6字节