求字符串长度
----strlen()
----sizeof()
char buf[] = "asadsa";
printf("sizeof(buf)=%d\n",sizeof(buf));//7
printf("strlen(buf)=%d\n",strlen(buf));//6
C语言的字符串数组在末尾默认加上’\0’
strlen()不算’\0’,只计算字符串的长度
sizeof()算上’\0’
另外sizeof()有一个要注意的,sizeof()用于数组,只能测出静态数组的大小,无法检测动态分配的数组大小,示例:
void transfer(char str[])
{
int i = 0;
for(i=0;i<sizeof(str)/sizeof(str[0]);i++)
{
if('a' <= str[i] && 'z' >= str[i])
str[i] -= ('a' - 'A');
}
}
像在这个函数里面,str是一个指向字符串的指针,求出来的长度只为4
|warning: 'sizeof' on array function parameter 'str' will return size of 'char *' [-Wsizeof-array-argument]|
编译器的warning,所以sizeof()不能求动态分配的数组的大小
对字符串进行拷贝设置
字符串设置
----memset()
常用来对字符串进行初始化,初始化为单一的值
char str1[5] = "1234";
printf("str1:%s\n",str1);
memset(str1,'0',strlen(str1));//目标字符串,初始化值,长度
printf("str1:%s\n",str1);
结果
str1:1234
str1:0000
字符串拷贝
----strcpy()
这个有时候面试也让写一下这个函数
这里贴出来
char * strcpy(char *dest, const char *src)
{
if((dest == NULL) || (src == NULL))
{
return NULL;
}
char *ret = dest;
while((*dest++ = *src++) != '\0');
return ret;
}
strcpy()示例
char str1[20] = "Hello World";
char str2[20];
memset(str2,'0',sizeof(str2)-1);
printf("str2:%s\n",str2);
strcpy(str2,str1);
printf("str2:%s\n",str2);
输出结果:
str2:0000000000000000000
str2:Hello World
----memcpy()
char str1[20] = "Hello World";
char str2[20];
char str3[20];
memset(str2,'0',sizeof(str2)-1);
printf("str2:%s\n",str2);
strcpy(str2,str1);
printf("str2:%s\n",str2);
memcpy(str3,str1,strlen(str1));
printf("str3:%s\n",str3);
输出结果:
str2:0000000000000000000
str2:Hello World
str3:Hello World
咋一看好像没什么区别
但是strcpy ()会拷贝结束符’\0’
memcpy()需要指定长度
strcpy()只用于字符串的复制,memcpy()对于要复制的内容没有限制
在使用strcpy()的时候如果不注意长度就会出现越界访问内存的问题,例子如下
char a;
char *str=&a;
strcpy(str,"hello");
printf(str);
将一个字符串复制进一个字符变量指针所指地址,虽然可以正确输出结果,但因为越界进行读写而导致程序崩溃。