C语言字符串学习注意事项

字符串内部不能出现字符串终止符NUL,NUL不是字符串的一部分,所以字符串长度不包含NUL.头文件string.h包含了使用字符串函数所需的原型和声明。

不受限制的字符串函数:最常用的字符串函数都是不受限制的,就是说它们只是通过寻找字符串参数结尾的NUL字节来判断字符串长度,这些函数一般指定一块内存区域用于存放结果字符串,使用这些函数时,程序员必须保证结果字符串不会溢出这块内存。

如:

char *strcpy(char *dst,char *src); 连同src 的 NUL标志一起复制

dst必须是一个字符数组,或一个指向动态分配内存的数组指针,不能使用字符串常量。程序员必须保证目标字符串有足够的空间容纳要复制的src,如果src过长,src仍然完整地被复制,strcpy函数将侵占dst后面的部分内存空间,改写原来存储在那里的变量。如果在使用前,确保dst足以容纳src,将避免大量的调试工作。

char *strcat(char *dst, char *src);字符串连接函数,同上一样,程序员必须保证dst有足够的空间以保存整个src。

长度受限的字符串函数:

char *strncpy(char *dst,char *src,size_t len);

strncpy向目标字符串复制len个字符,如果strlen(src)小于len,dst数组将用额外的NUL填充到len长度,如果strlen(src)大于len,那么只有len个字符会被复制到dst中,注意,它的结果将不会以NUL结尾,dst将不再是一个字符串,在对dst使用不受限制的字符串操作函数时(如strlen),strlen将会查找直到它发现一个NUL为止,或许它找了几百个字符才找到,strlen的返回值从本质上说是一个随机数。

char *strncat(char *dst,char *src,size_t len);此、函数总是向目标复制len个字符(再加一个NUL),它不管目标参数除去原来的字符串后留下的空间够不够。

两种容易混淆的初始化:

char *str1="adggg";初始化一个字符串常量,自动加上NUL

char str2[]="sag";初始化一个字符数组,可重新赋值,自动加上NUL,字符数组为4,字符串长度为3(使用strlen测试)

C语言中字符串的赋值

1、定义的时候直接用字符串赋值

char a[10]="hello";

注意:不能先定义再给它赋值,如char a[10]; a[10]="hello";这样是错误的!

char *str1="adggg";等价于

char *str1;

str1="adggg";因为str1为指针变量,其值可以改变。

2、对数组中字符逐个赋值

char a[10]={'h','e','l','l','o'};//后面自动加上NUL

char a[]="hello";<==>char a[]={'h','e','l','l','o','\0'};//

char a[]={'h','e','l','l','o'};//无NUL

在 c 语言中,将字符串作为字符数组来处理,在实际应用中人们关心的是有效字符串的长度而不是字符数组的长度

系统对字符串常量也自动加一个'\0' 作为结束符,有了结束标志'\0'  后,字符数组的长度就显得不那么重要了,在程序中往往依靠 检测'\0'   的位置来判定字符串是否结束,而不是根据数组的长度来决定字符串长度。当然,在定义字符数组时应估计实际字符串长度,保证数组长度始终大于 字符串实际长度。(在实际字符串定义中,常常并不指定数组长度,如char str[ ]

3、利用strcpy

char a[10]; strcpy(a, "hello");

易错情况:

1char a[10]; a[10]="hello";//一个字符怎么能容纳一个字符串?况且a[10]也是不存在的!

2char a[10]; a="hello";//这种情况容易出现,a虽然是指针,但是它已经指向在堆栈中分配的10个字符空间,现在这个情况a又指向数据区中的hello常量,这里的指针a出现混乱,不允许!

 

 

 

转载于:https://my.oschina.net/fzliu/blog/33275

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值