c语言—常见字符串函数与sizeof详解

1.sizeof使用

a.代码1

int main()
{
	int a = 0;
	int arr[] = { 1,2,3,4 };
	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof a);
	printf("%d\n", sizeof(&a));//表示地址的大小
	printf("%d\n", sizeof(int));
	printf("%d\n", sizeof(arr));//计算数组arr的大小(单位为字节)
	printf("%d\n", sizeof(arr)/sizeof(arr[0]));//计算数组arr的空间个数
	return 0;
}

解释:

(1)sizeof是计算大小的(单位为字节), sizeof后面可以跟变量,类型(跟类型时一定要将类型括起来),地址(因为是32位机器,所以地址大小为4字节,如果是64位,结果就是8字节),数组名。

(2)sizeof也可以计算数组的空间的个数。

2.strlen函数

a.代码1

int main()
{
	char arr1[] = { 'a','b','c','\0'};
	char arr2[] = { 'a','b','c' };
	char arr3[4] = { 'a','b','c' };
	char*str = "abc";
	printf("%d\n", strlen(arr1));
	printf("%d\n", strlen(arr2));
	printf("%d\n", strlen(arr3));
	printf("%d\n", strlen(str));
	return 0;
}

解释:

(1)strlen函数是计算'\0'前的元素个数,此时arr1数组有4个空间,有'\0','\0'前面有3个元素。

(2)此时arr2数组有3个空间,没有'\0',所以就产生了一个随机数。

(3)此时arr3数组有4个空间,前面3个空间放的是"abc",最后一个空间系统添加了一个'\0'。

(4)指针变量指向字符串"abc"等价与"abc\0"。

注意:

(1)strlen(包括strcmp strcpy strcat等)函数是用于字符串的,而不是整型数组的。

(2)strlen函数是计算'\0'前的字符个数,即有效字符的个数。

b.代码2

int main()
{
	char* str1 = "abc";
	char* str2 = "abcd";
	if (strlen("abc") < strlen("abcd"))
	{
		printf("aa\n");
	}
	else
	{
		;
	}
	if (strlen(str1) - strlen(str2) > 0)
	{
		printf("aa\n");
	}
	else
	{
		;
	}
	return 0;
}

解释:

(1)strlen的返回值是无符号的整型(unsigned int),所以(strlen(str1) - strlen(str2))最终的值也是无符号的,即>=0。

注意:

(1)一定要引头文件<string.h>,不然结果就只有一个"aa"

3.sizeof与strlen函数对比

a.代码1

int main()
{
	char arr1[] = { 'a','b','c' };//3个空间,没有字符'\0'
	char arr2[] = "abc";//4个空间,字符'c'后面默认跟一个'\0'
	char arr3[] = "a\0bc";
	printf("%d\n", sizeof(arr1));
	printf("%d\n", sizeof(arr2));
	printf("%d\n", sizeof(arr3));
	printf("%d\n", strlen(arr1));
	printf("%d\n", strlen(arr2));
	printf("%d\n", strlen(arr3));
	return 0;
}

解释:

(1)sizeof是计算大小的,strlen是计算'\0'前的字符个数的。 

4.strcmp函数

a.代码1

int main()
{
	char arr1[] = "abc";
	char arr2[] = "abc";
	char arr3[] = "bcd";
	printf("%d\n", strcmp(arr1, arr2));
	printf("%d\n", strcmp(arr1, arr3));
	return 0;
	
}

解释:

(1)两个字符串比较,就是字符逐个比较,直到发现不匹配为止。

注意:

(1)两个字符串进行比较时,如果arr1等于arr2,strcmp返回零。arr1小于arr2,strcmp返回一个小于零的数(不一定是-1)。arr1大于arr2,strcmp返回一个大于零的数(不一定是1)。

(2)进行两个字符串比较时,一定要有'\0'。

b.代码2

int main()
{
	char arr1[] = "abc";
	char arr2[] = "abc";
	if (strcmp(arr1, arr2))
	{
		printf("aa");
	}
	else
	{
		printf("bb");
	}
	return 0;
}

 

注意:

(1)不要把代码解读成arr1与arr2相等,结果为真,执行if语句。此时的strcmp的返回值是0,所以执行else语句。

5.strncmp函数

a.代码1

​
int main()
{
	char* str1 = "abc";
	char* str2 = "abcd";
	printf("%d\n", strncmp(str1, str2, 2));
    printf("%d\n", strncmp(str1, str2, 4));
	return 0;
}

​

解释:

(1)选择需要比较的个数,返回值和strcmp一样。

int strncmp( const char *string1, const char *string2, size_t count );

6.strcpy函数

a.代码1

int main()
{
	char dest[] = "abc";
	char* src = "de";//"de"等价于"de\0"
	printf("%s", strcpy(dest, src));
	return 0;
}

 解释:

(1)

char *strcpy( char *strDestination, const char *strSource );

将src字符串的副本(所以src是不能改变的),拷贝到到dest(所以dest是可以改变的),返回dest的地址 。

(2)"de"字符串后面是有'\0'的,当再次读取dest时,字符'c'是无效字符。

(3)拷贝后的结果

注意:

(1)数组dest是可以改变的,一定不是字符串常量,即char*dest="abc";

(2)src一定要以'\0'结尾,不然程序会崩溃的。

(3)保证dest的空间足以容纳拷贝过来的字符串,不然会导致溢出。

b.代码2

int main()
{
	char dest[4] = "abc";
	char* src = "efgh";
	printf("%s", strcpy(dest, src));
	return 0;
}

 

 解释:

(1)dest的空间只有4个,拷贝过去的字符有5个("efgh"=="efgh\0"),即使最终的结果能打印出来,但是dest周围的栈空间破坏了。

7.strncpy函数

a.代码1

int main()
{
	char dest[] = "abcde";
	char* src = "fgh";
	printf("%s\n", strncpy(dest, src, 5));
	return 0;
}

解释:

(1)

char *strncpy( char *strDest, const char *strSource, size_t count );

strncpy函数最后一个参数(count)是控制拷贝到dest里面的字符个数。当count大于src字符串个数时,数组dest将用'\0'填充到count。

b.代码2

int main()
{
	char dest[] = "abcde";
	char* src = "fgh";
	printf("%s\n", strncpy(dest, src, 2));
	return 0;
}

解释:

(1)src的字符个数大于count ,就拷贝count个字符到dest。

8.strcat函数

a.代码1

int main()
{
	char dest[7] = "abc";
	char*src = "def";
	printf("%s", strcat(dest, src));
	return 0;
}

 解释:

(1)将字符串"def"(等价于"def\0")追加到dest后面。

(2)返回值为字符数组dest的地址。

注意:

(1)保证dest剩余的空间,足以容纳下追加的字符串,否则会出现溢出的情况。

(2)字符数组dest可以改变,src指向的字符串不可以改变。

9.strncat函数

a.代码1

int main()
{
	char dest[7] = "abc";
	char*src = "def";
	printf("%s", strncat(dest, src,2));
	return 0;
}

解释:

(1)在dest后面追加2个字符,即"de" ("de"后面有一个'\0',作为结束标志)。

(2)返回值为数组dest的地址。

注意:

(1)保证dest剩余的空间,足以容纳下追加的字符,否则会出现溢出的情况。

(2)字符数组dest可以改变,src指向的字符串不可以改变。

     字符串函数与sizeof的使用今天就分享到这里了,如果对你有帮助的话,可以给个关注,随便给个赞。

  

  • 104
    点赞
  • 135
    收藏
    觉得还不错? 一键收藏
  • 36
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值