C语言——字符串的使用

基于string库函数封装过程的研究,引发的相关知识探究:

1、关于字符串的使用:
        (1)char str[n] 即栈区分配 n 个字节的的空间,但是在使用的过程中,会出现超出分配的空间,例如:使用 strcpy 函数将一个字符串长度大于 n 的字符串拷贝在数组 str 中,超过 n 个字节的部分会顺序存储在 str+n 的地址后面,即被拷贝的字符串到了新的地址空间 str 仍旧满足物理上的顺序结构;  

	char array[10] = "ab";
	char str[] = "i love my country";
	my_strcpy(array,str);
	printf("%s\n", array);

  在调试上述代码时,可以顺利运行 my_strcpy ,但是运行到结尾处 ‘ } ’ 时会报错 :

运行时检查失败#2-在变量‘数组’周围的堆栈被破坏.

在调试过程中,也是发现定义一个大小为 10 的数组,在没有数据的位置都是以 ' \0 ' 的形式存在的,而没有分配的地址空间是以 -52'?' 的形式存在,可见是不合法的;但是在 my_strcpy 的过程中 str 访问到了没有被分配的地址空间,编译器也没有报错,仍旧继续进行访问;

联系与反思:

使用 malloc 在堆区申请一块空间,返回空间的首地址,申请的地址是一块物理连续的地址空间,那么既然申请的是一块连续的地址空间,是否也可以越界访问并拥有可写权限;

	int* space = (int*)malloc(sizeof(int)*10);
	for (int i = 0; i < 15; i++) {
		*(space + i) = i;
	}

在上述代码中我们可以看到 malloc 申请了一块大小为 sizeof (int)*10 的地址空间,在调试窗口中可以看到这一块空间存储的都是 0 或者随机数,当我们在 for 循环的中访问到第十一个 int 空间时,代码没有报错,继续访问,也有可写权限;

从可以知道定义数组可知,编译器会在代码结尾处报错——变量‘数组’周围的堆栈被破坏,但是在非 malloc 申请的地址空间下操作,编译器未报错;

在后续的操作中——获取未申请的且被修改的空间的地址,用指针指向这一块地址,依旧是可以进行操作;

(2)关于 char *str 、char str [num] 和char str[ ] 三种字符串的定义方式;

char str [num] 是在栈区分配的空间,栈区空间是由系统分配与释放;随着函数结束,系统自己会清除;

char str[ ] 是将存放在静态存储区即常量区中的常量拷贝在数组 str 中;即在堆区申请一块空间进行存储拷贝过来的常量,也就是说此时 str 也就和上述的str[num] 是等价的;

char *str 是将指针 str 指向常量区的常量地址,而静态存储区是不可修改的,只有可读权限,并没有修改权限,故而 char *str 可以打印出来,而不能修改其中的值;

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
sscanf函数是C语言中一个非常常用的函数,它可以将一个字符串按照指定的格式转换成相应的数据类型。在嵌入式开发中,sscanf函数也是非常常见的,因为很多时候需要从串口或者其他外部设备中读取数据,并将其转换成相应的数据类型进行处理。下面是一些sscanf函数的使用技巧: 1. 使用sscanf函数时一定要注意格式字符串的正确性。格式字符串中的占位符必须与待转换的数据类型相对应,否则会发生未知错误。 2. 如果待转换的字符串中包含多个数据,可以使用多个占位符进行转换。例如,如果待转换的字符串为"1,2,3",可以使用" %d,%d,%d"的格式字符串进行转换。 3. 可以使用sscanf函数的返回值来判断转换是否成功。如果返回值等于待转换字符串的长度,则说明转换成功,否则转换失败。 4. 如果待转换的字符串中包含浮点数,可以使用"%f"或者"%lf"的格式字符串进行转换。 5. 如果待转换的字符串中包含十六进制数,可以使用"%x"的格式字符串进行转换。 6. 如果待转换的字符串中包含字符或字符串,可以使用"%c"或者"%s"的格式字符串进行转换。 7. 如果待转换的字符串中包含指针类型的数据,可以使用"%p"的格式字符串进行转换。 总之,在使用sscanf函数时一定要注意格式字符串的正确性,否则很容易出现转换错误的情况。同时,还应该注意sscanf函数返回值的判断,以确保转换的正确性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值