1、sizeof 与 stlen
sizeof()功能:计算数据空间的字节数;
strlen()计算字符数组的字符数,以"\0"为结束判断,不计算’\0’;
char * s1 = "hello";
char s2[] = "hello";
char s3[100];
char* s4=(char*)malloc(100);
void *s5=(void*)malloc(100);
char str1[5]={'h','e','l','l','o'};
char str2[6]={'h','e','l','l','o','\0'};
sizeof(s1) = 4
32位系统 指针大小都是4个字节(等于 int 类型的大小)
64位系统 指针大小都是8个字节
sizeof(s2) = 6
char s2[] = “hello” 这种类型的定义 编译器会在最后自动加上结束符'\0'
strlen(s2) = 5 只计算有效字符,结束符'\0'不计算
sizeof(s3) = 100 1*100=100
计算数组所占空间的大小=一个元素占的空间*数组中的元素个数
sizeof(s4) = 4 指针所占空间大小都为4
sizeof(s5) = 4 指针所占空间大小都为4
sizeof(str1) = 5 计算数组大小 1*5 = 5
strlen(str1) = 未知 没有结束符'\0',结果可能是随机数
sizeof(str2) = 6 计算数组大小 1*6 = 6
strlen(str1) = 5 只计算有效字符,结束符'\0'不计算
2、strcpy strcmp strcat
strcpy 操作的字符串必须含有结束符’\0’
原型声明:char strcpy(char dest, const char *src);
头文件:#include <string.h> 和 #include <stdio.h>
功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串
参数:des为目标字符串,source为原字符串。
char* strcpy(char* des,const char* source)
{
char* r=des;
assert((des != NULL) && (source != NULL));
while((*r++ = *source++)!='\0');
return des;
}
strcpy 会在字符串最后加上结束符’\0’
示例:
char a[] = "abcdefg";
char b[] = "ABC"
strcpy(a,b);
a的最终结果是: "ABC\0efg"
标准字符串库函数 操作的字符串必须含有结束符’\0’
strcmp(区分大小写)
功 能:串比较
用 法:int strcmp(char *str1, char *str2);
当s1<s2时,返回为负数;当s1=s2时,返回值= 0;当s1>s2时,返回正数
int strcmp(const char *str1,const char *str2)
{
/*不可用while(*str1++==*str2++)来比较,当不相等时仍会执行一次++,
return返回的比较值实际上是下一个字符。应将++放到循环体中进行。*/
while(*str1 == *str2)
{
assert((str1 != NULL) && (str2 != NULL));
if(*str1 == '\0')
return 0;
str1++;
str2++;
}
return *str1 - *str2;
}
stricmp(不区分大小写)
实现的原理的 把所有的大写字母 转化成小写字母然后比较
大写字母比小写字母小32 小写字母大 (‘a’-‘A’ = 32)
int my_stricmp(const char *dst, const char *src)
{
int ch1, ch2;
do
{
if ( ((ch1 = (unsigned char)(*(dst++))) >= 'A') &&(ch1 <= 'Z') )
ch1 += 0x20;
if ( ((ch2 = (unsigned char)(*(src++))) >= 'A') &&(ch2 <= 'Z') )
ch2 += 0x20;
} while ( ch1 && (ch1 == ch2) );
return(ch1 - ch2);
}
strstr
s1: 被查找目标
s2: 要查找对象
返回值:若s2是s1的子串,则返回s2在s1的首次出现的地址;
如果s2不是s1的子串,则返回NULL。
char *strstr(constchar*s1,constchar*s2)
{
int n;
if(*s2)
{
while(*s1)
{
for(n=0;*(s1+n)==*(s2+n);n++)
{
if(!*(s2+n+1))
return(char*)s1;
}
s1++;
}
return NULL;
}
else
return (char*)s1;
}