C语言之字符串

#C语言之字符串

  • 字符串定义
  • 字符串的输入输出
  • 字符串函数
  • 字符串杂项

##字符串定义

  • 字面量定义
  • 字符串数组定义
  • 字符串指针定义

###字面量定义
字符串的字面量定义也就是常说的字符串常量定义,形如以下形式:
“hello c string"
上面的字符串就成为字符串的常量定义,这个字符串自身就是一个地址,只不过是一个匿名地址,可以像使用数组或指针那样使用这个字面量。比如使用*(“hello c string")即可访问该字符串常量的第一个字符’h’,另外,字符串常量在内存中具有静态存储期,在程序运行的期间一直存在,有的编译器只对字符串常量进行一次存储,如果在程序中多次用到该字符串,那么实际上引用的是同一个字符串,有的编译器则不一样,会不同的内容相同的字符串分配不同的地址,如:

#include <stdio.h>
#define MSG "hello"
int main(void)
{
  printf("MSG:%p---%s",MSG,MSG);
  printf("not MSG:%p---%s\n","hello","hello");
   
  return 0;

}

这里写图片描述

###字符串数组定义
可以用数组来定义字符串,数组将字符串中的字符顺序存储在数组中,并在数组末尾添加空字符’\0’作为字符串的结束标志,因此用数组来存储字符串必须保证字符串数组大小大于等于字符串大小+1。
通过字符串字面量的定义可以知道,字符串常量具有静态存储期,有的编译器在内存中只对字符串进存储,因此在用字符串数组存储字符串时,实际上存储的是该字符串字面量的副本,所以,在字符串数组中改变字符串并不会改变原始字符串字面量的内容。

###字符串的指针定义
字符串还可以通过指针来定义初始化,通过定义一个指向字符的指针变量,然后赋予字符串字面就可以构建一个字符串,通过这个指针变量就可以很方便的使用字符串了。
char *p=“I am a coder”;
但是上面的定义方式并不安全,因为上面已经介绍过了字符串常量是静态变量,在内存中有的编译器只进行一次存储,因此上面的指针p可能会修改这个字符串,如果有语句:
p[0]=‘H’;
那么原始的字符串字面量就可能会被改成"H am a coder",这样在后续使用该字符串字面量时就会造成错误,比如,现在要打印这个字符串字面量:
puts(“I am a coder”);
但是因为上面已经更改了原始的字符串字面量,因此打印出来的实际上是:“H am a coder”,与预期的结果矛盾,造成了错误,如:

#include <stdio.h>
#define MSG "hello"
int main(void)
{
  printf("MSG:%p---%s",MSG,MSG);
  printf("not MSG:%p---%s\n","hello","hello");
  
  char *p="hello";
  p[0]='T';
  puts("hello");
  
  return 0;

}

这里写图片描述
为了避免上述的情况,我们应该使用const避免这种错误:
const char *p=“I am a coder”;

##字符串的输入输出
字符串的输入输出函数都包含在stdio.h头文件中,为字符串的输入输出提供方便。

  • 字符串的输入
    • scanf
    • gets
    • fgets
  • 字符串的输出
    • printf
    • puts
    • fputs

###字符串的输入
在所有字符串的输入中,都必须先定义好字符串的输入空间,空间必须要有足够的大小容纳输入,不能引起内存泄露,数组越界等问题。
####scanf
sacnf函数用于从标准输入中将数据输入到内存中,scanf用%s格式字符串可以实现字符串的输入,但这样只能将输入缓冲中从第一个非空白字符到第一个空白字符之间的字符输入到指定内存空间中,实际上,只能输入一个单词。
char input[10];
scanf("%s",input);
将从标准输入中得到一个长度不超过9的字符串。

###gets
gets用于从输入缓冲中获取一行字符串,直到遇到换行符或者文件尾为止,并自动丢弃字符串末尾的换行符,gets通常与puts搭配使用,gets原型如下:
char *gets(char *string);
如果函数读取成功,并自动丢弃字符串中的换行符,返回string指针,否则返回null。
使用gets函数存在安全隐患,因为gets函数没有限定读取字符的个数,因此不知道目标空间是否可以装的下输入字符串,容易造成溢出问题。新的C标准已经放弃gets,转用fgets代替gets。

###fgets
fgets功能等同于gets,是gets的安全版本,通常与fputs搭配使用,其原型如下:
char *fgets(char *buf, int bufsize, FILE *stream);
buf表示函数读入数据的目标空间,bufsize表示要读取的字符个数,stream表示从哪个文件读入数据。
如果函数读取成功就返回指向buf的指针,如果输入的数据长度大于bufsize,则读取的是一个不完整的行,只包含bufsize个字符,如果输入字符串长度小于bufsize,则读取的是一个完整的行,包括行尾的换行符在内一起读入buf中,但如果读取错误或者遇到文件结尾,就返回null。

###字符串的输出

####printf
printf用于格式化输出字符串,用"%s"作为格式转换说明输出字符串。
char out=“I love coding”;
printf("%s",out);
就可以成功输出字符串。

####puts
puts函数通常和gets函数配合使用,其只有一个参数,就是要输出的字符串空间,函数会在字符串末尾自动添加换行符,然后输出。

####fputs
fputs函数通常和fgets函数配合使用,其函数原型如下:
int fputs(const char *str, FILE *stream);
str表示要输出的字符串,为不可变型,stream为输出的文件流,如果输出到屏幕上(标准输出),就用stdout代替stream。

##字符串函数
字符串是一种很有用的数据结构,因此C语言为处理这些字符串提供了大量的处理函数,都包含在string.h头文件中。

  • strlen
  • strcat
  • strncat
  • strcpy
  • strncpy
  • strcmp
  • strncmp
  • strchr
  • strrchr
  • strstr

###strlen
用于返回字符串中的字符数,不包含末尾的空字符。原型:
size_t strlen(const char *s);
###strcat
用于返回两个字符串连接后的字符串,源字符串的第一个字符会覆盖掉目标字符串的结尾空字符。原型:
char * strcat(char *restrict s1,const char *restrict s2);
结果返回拼接后指向s1的指针。
但这个函数同gets函数一样存在安全隐患,为此引入了strncat。
###strncat
同strcat一样用于返回两个字符串连接后的字符串,但只将源字符串中n个字符连接到目标字符串,更为安全,源字符串的第一个字符会覆盖掉目标字符串的结尾空字符。原型:
char * strncat(char *restrict s1,const char *restrict s2,size_t n);
结果返回拼接后指向s1的指针。
###strcpy
用于将源字符串中的内容(包括结尾空字符)复制到目标指针指向的字符串位置。原型:
char * strcpy(char *restrict s1,const char *restrict s2);
结果返回操作后指向s1的指针。
但这个函数同gets函数一样存在安全隐患,为此引入了strncpy。
###strncpy
用于将源字符串中的n个字符复制到目标指针指向的字符串位置。原型:
char * strncpy(char *restrict s1,const char *restrict s2,size_t n);
结果返回操作后指向s1的指针。
###strcmp
将源字符串与目标字符串进行比较,若源字符串和目标字符串相等则返回0,否则返回原字符串与目标字符串第一个不同的字符之间的ascall码差值。原型:
char * strcmp(const char * s1,const char * s2);

###strncmp
有时为了比较上的方便,只需将源字符串与目标字符串的前n个字符进行比较,若源字符串和目标字符串相等则返回0,否则返回原字符串与目标字符串第一个不同的字符之间的ascall码差值。原型:
char * strncmp(const char * s1,const char * s2,size_t n);

###strchr
在目标字符串中查找字符c,如果查找到了,则返回该字符在字符串中的指针,否则返回null,注意查找返回包括字符串的末尾空字符。原型:
char * strchr(const char * s,int c);

###strrchr
在目标字符串中查找字符c,如果查找到了,则返回该字符在字符串中最后出现的指针,否则返回null。原型:
char * strrchr(const char * s,int c);

###strstr
在目标字符串中查找源字符串,如果查找到了,则返回源字符串在目标字符串中出现的首位置,否则返回null。原型:
char * strstr(const char * s1,const char * s1);

##字符串杂项
字符串处理中还有一些比较有用的函数,比如ctype.h中的tolower(),toupper()等函数,虽然只是处理单个字符,但有时在处理字符串时十分有用。此外在stdlib.h中还有将字符串转换为数字的atoi、atof()等函数,以及strtol()等函数。

您的赞助将是我不断创作的最大动力,谢谢支持!!!
如果您觉得我的文章对您有帮助,可以通过以下方式进行赞赏:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值