字符串和字符函数

1.如果字符串文字之间没有间隔或者是间隔是空格符,ANSI C 会将它串联起来。

如:

    char str[50] = "I ""am ""a " "student";
    char str1[50] = "I am a student";

它们是相等的。

2.如果想在字符串之前加一个双引号的话,可以在双引号之前加一个反斜线进行转义。

3.字符串常量属于静态存储类,静态存储是指如果在一个函数中,使用字符串常量,即使是多次使用了这个函数,该字符只在程序的整个运行过程中存储一份,整个引号中的内容作为指向该字符串存储位置的指针。

4.声明一个数组时,数组大小必须为整型常量,而不能是运行时得到的变量值。因为除非说明了,要不然编译器并不知道要预留多大的空间。

5.gets(): 从标准输入设备中获得一个字符串,因为字符串没有预定的长度,所以gets()需要知道输入何时结束,需要加一个换行。

6.在Linux上,使用gets(),虽然能够成功运行,但是会出现警告,gets()函数由于它没有指定输入字符的大小,如果输入字符大于定义的数组长度,那就会发生数组越界问题。

#include<stdio.h>
#define MAX 81
int main()
{
    char name[MAX] = {0};
    char *ptr = NULL;
    printf("Hi,what's your name?\n");
    ptr = gets(name);
    printf("Nice name,%s\n",ptr);
    return 0;
}
name1.c:17:5: warning: ‘gets’ is deprecated (declared at /usr/include/stdio.h:638) [-Wdeprecated-declarations]
     ptr = gets(name);
     ^
/tmp/ccM1miiP.o: In function `main':
name1.c:(.text+0x3f): warning: the `gets' function is dangerous and should not be used.

根据fgets()函数则可以根据定义数组长度自动截断字符,从而消除一些安全隐患。

       char *fgets(char *s, int size, FILE *stream);

 把stream 改为stdin,标准输入就可以在键盘里获取东西了。

 ptr = fgets(name,100,stdin);

7.空指针是一个地址,而字符是一个char类型的数据对象。

8.常见的处理字符串的函数

       char *strcpy(char *dest, const char *src);

功能:把src所指由'\0'结束的字符串复制到dest所指的数组中。   

说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。  返回指向dest的指针。   

注意:当src串长度>dest串长度时,程序仍会将整个src串复制到dest区域,可是dest数组已发生溢出。因此会导致dest栈空间溢出以致产生崩溃异常。如果不考虑src串的完整性,可以把dest数组最后一元素置为NULL,从dest串长度处插入NULL截取字串。

char * strncpy(char *dest, char *src, size_t n); 

功能:将字符串src中最多n个字符复制到字符数组dest中(它并不像strcpy一样遇到NULL才停止复制,而是等凑够n个字符才开始复制),返回指向dest的指针。   

说明:如果n > dest串长度,dest栈空间溢出产生崩溃异常。   

否则: 1)src串长度<=dest串长度,(这里的串长度包含串尾NULL字符) ,如果n=(0, src串长度),src的前n个字符复制到dest中。但是由于没有NULL字符,所以直接访问dest串会发生栈溢出的异常情况。 如果n = src串长度,与strcpy一致。如果n = dest串长度,[0,src串长度]处存放于desk字串,(src串长度, dest串长度]处存放NULL。   

2)src串长度>dest串长度 ,如果n =dest串长度,则dest串没有NULL字符,会导致输出会有乱码。如果不考虑src串复制完整性,可以将dest最后一字符置为NULL。   

    综上,一般情况下,使用strncpy时,建议将n置为dest串长度(除非你将多个src串都复制到dest数组,并且从dest尾部反向操作),复制完毕后,为保险起见,将dest串最后一字符置NULL,避免发生在第2)种情况下的输出乱码问题。当然喽,无论是strcpy还是strncpy,保证src串长度<dest串长度才是最重要的。

 

char * strcat ( char * dest, const char * src );

 src指向的字符串被复制到dest指向的字符串的结尾,复制过来的src所指字符串的第一个字符覆盖了dest所指字符串结尾的空字符。返回值为dest.

      char *strncat(char *dest, const char *src, size_t n);

src字符串中只有前n个字符被追加到dest字符串,复制过来的src字符串的第一个字符覆盖了dest字符串结尾的空字符,src字符串中的空字符及其后的任何字符都不会被复制,并且追加到一个空字符到所得结果后面。返回值是dest.

      int strcmp(const char *s1, const char *s2);

如果s1字符串在机器编码顺序中落后于s2字符串,函数的返回值是一个正数;如果两个字符相同,返回值为0;如果第一个字符串在机器编码顺序中先于第二个字符串,返回值是一个负数。

       int strncmp(const char *s1, const char *s2, size_t n);

改函数的作用与strcmp()一样,只是比较n个字符后或者遇见第一个空字符时会停止比较,由二者中最先被满足的那一个条件终止比较过程。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值