C语言之字符串

来源:互联网 发布:java希尔排序算法 编辑:程序博客网 时间:2024/05/17 22:17

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()等函数。
原创粉丝点击