strlen, sizeof, .size(), .length()

实验目的:探究与字符串长度相关的函数,strlen(), sizeof(), .size(), .length()

实验结果:1. strlen()中参数必须是char*类型,返回字符串中的字符长度,不计算末尾的'\0';

2. sizeof()返回变量、数据类型、数组等所占内存空间的大小。在已定义数组维度的时候,sizeof()返回的是数组维度;

3. .size()和.length()没有区别

#include <iostream>
#include <string>

using namespace std;

int main() {
	const char* str1 = "hello"; // char*是常量
	int len1 = strlen(str1); // 不能取和函数相同名字的变量名
	int len2 = sizeof(str1); // 传入指针,sizeof函数计算的是传入的参数在内存中存放需要占用多少个字节,在32位系统需要4个字节,64位需要8个字节,传入指针可以计算系统的寻址能力。
	cout << "char* 字符串" << str1 << "调用strlen后长度为" << strlen(str1) << endl;
	cout << "char* 字符串" << str1 << "调用sizeof后长度为" << sizeof(str1) << endl; // 64位系统返回8
	// cout << "char* 字符串" << str1 << "调用.size()后长度为" <<str1.size() << endl; char*不是类
	cout << endl;

	char str2[] = "hello";
	cout << "char型数组" << str2 << "调用strlen后长度为" << strlen(str2) << endl;
	cout << "char型数组" << str2 << "调用sizeof后长度为" << sizeof(str2) << endl;
	// cout << "char型数组" << str2 << "调用.size()后长度为" << str2.size() << endl;不能用.size()
	cout << endl;

	string str3 = "nihao";
	// cout << "string型字符串" << str3 << "调用strlen后长度为" << strlen(str3) << endl; 报错,不可以对string变量用strlen
	cout << "string型字符串" << str3 << "调用sizeof后长度为" << sizeof(str3) << endl;
	cout << "string型字符串" << str3 << "调用.length()后长度为" << str3.length() << endl;
	cout << "string型字符串" << str3 << "调用.size()后长度为" << str3.size() << endl;
	return 0;
}

举例(来自参考

1)char* ss = "0123456789";
sizeof(ss)为4,ss是指向字符串常量的字符指针,sizeof 获得的是指针所占的空间,则为4
sizeof(*ss)为1,*ss是第一个char字符,则为1


2)char ss[] = "0123456789";
sizeof(ss)为11,ss是数组,计算到'\0'位置,因此是(10+1)
sizeof(*ss)为1,*ss是第一个字符


3)char ss[100] = "0123456789";
sizeof(ss)为100,ss表示在内存中预分配的大小,100*1
strlen(ss)为10,它的内部实现用一个循环计算字符串的长度,直到'\0'为止。


4)int ss[100] = "0123456789";
sizeof(ss)为400,ss表示在内存中预分配的大小,100*4
strlen(ss)错误,strlen参数只能是char*,且必须是以'\0'结尾


5)char[] a={'a','b','c'};
sizeof(a)的值应该为3。
char[] b={"abc"};
sizeof(b)的值应该是4。
若string str={'a','b','c','\0','X'};
那么sizeof(str)为5,strlen(str)为3。
 

练习:(来自牛客网)

1. 执行以下代码段,会输出什么结果?

char a[] = "abc";
char b[] = {'a', 'b', 'c'};
printf("%d, %d", sizeof(a), sizeof(b));

A. 3, 3

B. 3, 4

C. 4, 3

D. 4, 4

【解析】考察字符数组赋值方式。a数组以字符串形式赋值,字符串末尾元素包含'\0',因此数组的最后一个元素也是'\0',总共4个元素;b数组采用单个字符逐个赋值的形式,总共3个元素。

【答案】C

2. 有如下代码,下列选项中,()是该段代码的正确输出?

#include <stdio.h>
#include <string.h>
#define PRAISE "NowCoder is benefit to everyone concerned."

int main() {
    printf("The phrase of PRAISE has %zd letters ", strlen(PRAISE));
    printf("and occuipies %zd memory cells.", sizeof(PRAISE));
    return 0;
}

A. The phrase of PRAISE has 42 letters and occuipies 42 memory cells.

B. The phrase of PRAISE has 42 letters and occuipies 43 memory cells.

C. The phrase of PRAISE has 43 letters and occuipies 42 memory cells.

D. The phrase of PRAISE has 43 letters and occuipies 43 memory cells.

【解析】strlen计算字符串中字符长度,sizeof计算字符串占内存空间大小(包含末尾的'\0')。本题和上一题一样,都是考察字符串结束符。

【答案】B

3. 以下代码段输出结果是()

char s1[] = "12345";
char* s2 = "1234";
printf("%d\n", strlen(strcpy(s1, s2)));

A. 4

B. 5

C. 9

D. 10

【解析】strcpy函数的作用:将s2指向的内存空间中的字符串(注意字符串以'\0'结尾)复制到以s1开始的内存空间中,并返回复制后的s1空间。执行strcpy(s1, s2)后,s1对应的内存空间中内容为「“1234\0\0”」,其中第一个'\0'是s2复制到s1中的,将原本空间上的「“12345\0”」替换成「“1234\0”」,第二个'\0'是原本就存在的。

【答案】A

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值