字符串的处理

文章目录

  • 字符串输入输出
    • 字符串输出
    • 字符串输入
  • 字符串操作
    • 长度计算
    • 拼接
    • 拷贝
    • 比较
    • 查找
    • 内存填充
    • 字符串转数字
    • 数字转字符串

字符串输入输出

字符串输出

字符串输出函数有putchar()、putc()、puts()、fputc()、fputs()。
字符串的处理_第1张图片
输出函数包含的头文件和函数原型如下。

#include 
int fputc(int c, FILE *stream);
int fputs(const char *s, FILE *stream);
int putc(int c, FILE *stream);
int putchar(int c);
int puts(const char *s);

对上面这些函数,将FILE *参数替换为stdout,带f的函数和不带f的函数功能就一样了。
putchar()函数可以把参数指定的无符号字符输出到标准输出设备。
putc()除了有putchar()的功能外,还可以将一个字符输出到文件。

putchar('A');
putc('A',stdout);  //这两条代码是一样的,都是输出到标准输出

puts()函数用来向标准输出设备输出字符串并自行换行,将’ \0 ‘转换为换行符’ \n '。
fputc()与putchar()类似,fputc()可把字符输出到指定的文件中,既可以是标准输出、标准错误设备,也可以是一个普通文件。

fputc('A', stdout);  //把字符A输出到标准输出

FILE *fp;
fputc('A', fp);  //把字符A输出到普通文件中

fputs()与puts()类似,fputs()可把字符串输出到指定的文件中,既可以是标准输出、标准错误设备,也可以是一个普通文件。

字符串输入

字符串输入函数有getchar()、getc()、gets()、fgetc()、fgets()。
字符串的处理_第2张图片
输入函数包含的头文件和函数原型如下。

#include 
int fgetc(FILE *stream);
char *fgets(char *s, int size, FILE *stream);
int getc(FILE *stream);
int getchar(void);
int ungetc(int c, FILE *stream);
char *gets(char *s);

对上面这些函数,将FILE *参数替换为stdin,带f的函数和不带f的函数功能就一样了。
getchar()函数用于从标准输入设备中读取一个无符号字符,包括空格、TAB制表符、换行回车符等。
getc()函数除了有getchar()的功能外,还可以从文件获取一个字符。

char ch;
ch = getchar();
ch = getc(stdin);  //这两条代码是一样的,都是从标准输入获取一个字符

gets()函数用于从标准输入设备中获取用户输入的字符串。用户从键盘输入的字符串数据首先会存放在一个输入缓冲区中,gets()函数会从输入缓冲区中读取字符串存储到字符指针变量s所指向的内存空间,当从输入缓冲区中读走字符后,相应的字符便不存在于缓冲区了。
gets()函数允许输入的字符串带有空格、制表符,输入的空格和制表符也是字符串的一部分,仅以回车换行符作为字符串的分割符。scanf以%s格式输入的时候,空格、换行符、TAB制表符等都是作为字符串分割符,分隔符前后是两个字符串,一个%s只能读取一个字符串,若要读取多个字符串,则需要使用多个%s,并且需要使用多个字符数组存储。gets()会将回车换行符从输入缓冲区中取出来,然后将其丢弃。scanf()读走缓冲区中的字符串数据时,并不会将分隔符读走并丢弃,使用scanf()读走缓冲区中的字符串数据之后,缓冲区中依然还存在用户输入的分隔符。
fgetc()与getchar()一样,用于读取一个输入字符。fgetc可以指定输入字符的文件,既可以从标准输入设备输入字符,也可以从一个普通文件中输入字符。
fgets()与gets()一样用于获取输入的字符串。gets()只能从标准输入设备中获取输入字符串,而fgets()既可以从标准输入设备获取字符串,也可以从一个普通文件中获取输入字符串。fgets()可以设置获取字符串的最大字符数。gets()会将缓冲区中的换行符’\n’读取出来、将其丢弃、将’\n’替换为字符串结束符’\0’;fgets()也会将缓冲区中的换行符读取出来,但并不丢弃,而是作为字符串组成字符存在,读取完成之后自动在最后添加字符串结束字符’\0’。


字符串操作

长度计算

计算字符串长度使用strlen()函数。

#include 
size_t strlen(const char *s);

参数s是需要进行长度计算的字符串,字符串必须包含结束字符’ \0 ‘。返回值是字符串的长度,’ \0 ‘不计算在内。
提到strlen就必须提到sizeof,两者的区别如下。
①sizeof是C语言内置的操作符关键字,而strlen是C语言库函数;
②sizeof用于计算数据类型的大小或者变量的大小,而strlen只能以结尾为’ \0 '的字符串作为参数;
③编译器在编译时就计算出了sizeof的结果,而strlen必须在运行时才能计算出来。

拼接

字符串拼接使用strcat()函数或者strncat()函数。

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

dest是目标字符串,src是源字符串且不可更改,返回的是指向目标字符串dest的指针。
strcat()函数会把src所指向的字符串追加到dest所指向的字符串末尾,所以必须要保证dest有足够的存储空间来容纳两个字符串,否则会导致溢出错误。dest末尾的’\0’结束字符会被覆盖,src末尾的结束字符’\0’会一起被复制过去,最终的字符串只有一个’\0’。
strncat()可以指定源字符串追加到目标字符串的字符数量,这样使用更安全,确保数组不会溢出。

拷贝

字符串拷贝使用strcpy()函数或者strncpy()函数。

#include 
char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);

strcpy()会把包含结束字符’\0’的src字符串复制到dest,所以必须保证dest指向的内存空间足够大,能够容纳下src字符串,否则会导致溢出错误。复制后,dest字符串会被新复制进来的字符串所覆盖。
strncpy()可以指定从源字符串src复制到目标字符串dest的字符数量,当n小于源字符串src的长度时,复制过去的字符串中没有包含结束字符’\0’,当n大于等于源字符串src的长度加1时,结束字符’\0’才会被复制过去。
除了strcpy()和strncpy()之外,还可以使用memcpy()、memmove()以及bcopy()这些库函数实现拷贝操作。

比较

字符串比较使用strcmp()和strncmp()函数。

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

s1和s2是要进行比较的两个字符串的指针,strncmp()中的参数n是要比较的前n个字符。
返回值小于0表示s1指向的字符串小于s2指向的字符串,返回值大于0表示s1指向的字符串大于s2指向的字符串,返回值等于0表示s1指向的字符串等于s2指向的字符串。
strcmp进行字符串比较,主要是通过比较字符串中的字符对应的ASCII码值,strcmp会根据ASCII编码依次比较两个字符串对应的每一个字符,直到出现了不同的字符,或者某一字符串已经到达末尾。

查找

字符串中某个字符的查找使用strchr()和strrchr()函数。

#include 
char *strchr(const char *s, int c);
char *strrchr(const char *s, int c);

s是给定的目标字符串,c是需要查找的字符。返回字符c第一次在字符串s中出现的位置,如果未找到字符c,则返回NULL。
字符串结束字符’\0’作为字符串的一部分,如果将参数c指定为’\0’,则函数将返回指向结束字符的指针。
strchr()函数在字符串中查找指定字符是从前向后的顺序,而strrchr()函数在字符串中查找指定字符是从后向前的顺序。
字符串中某个子字符串的查找使用strstr()函数。

char *strstr(const char *haystack, const char *needle);

strstr()函数在给定的字符串haystack中查找第一次出现子字符串needle的位置,不包含结束字符’\0’。如果目标字符串haystack中包含了子字符串needle,则返回该字符串首次出现的位置,如果未能找到子字符串needle,则返回NULL。
此外,strpbrk()函数可以用于查找指定的字符串。

#include 
char *strpbrk(const char *s, const char *accept);

index()和rindex()函数用于查找指定的字符。

#include 
char *index(const char *s, int c);
char *rindex(const char *s, int c);

内存填充

有时候需要将某一块内存中的数据全部设置为指定的值,比如初始化数组。memset()函数用于将某一块内存的数据全部设置为指定的值。

#include 
void *memset(void *s, int c, size_t n);

s是需要进行数据填充的内存空间起始地址;c是要被设置的值,该值以int类型传递,n是要填充的字节数,返回指向内存空间s的指针。需要注意的是,参数c虽然是以int类型进行传递的,但memset()函数在填充内存块时使用该值的无符号字符形式,即函数内部会将该值转换为unsigned char类型的数据,以字节为单位进行数据填充。

char str[100]; 
memset(str, 0x0, sizeof(str)); //初始化数组全为0

bzero()函数用于将某一块内存的数据全部设置为0,相当于memset()函数的一个子集。

#include 
void bzero(void *s, size_t n);

bzero()函数相比于memset()函数少了一个参数,少的参数就是填充的值,该函数默认填充0。

字符串转数字

atoi()、atol()、atoll()函数可用于将字符串分别转换为int、long int以及long long类型的数据。

#include 
int atoi(const char *nptr);
long atol(const char *nptr);
long long atoll(const char *nptr);

nptr是需要进行转换的字符串,返回值就是函数对应的数据类型。
目标字符串nptr中可以包含非数字字符,转换时跳过前面的空格字符,如果字符串中的第一个数字字符前面有除了空格、正负号以外的字符,那么转换结果就是0,直到遇上数字字符或正负符号才开始做转换,开始之后再遇到非数字、空格或’\0’时就结束转换,并将结果返回。atoi()、atol()、atoll()函数只能转换十进制表示的数字字符串。
strtol()、strtoll()两个函数可分别将字符串转为long int类型数据和long long ing类型数据。可以实现将多种不同进制数表示的字符串转换为整形数据。

#include 
long int strtol(const char *nptr, char **endptr, int base);
long long int strtoll(const char *nptr, char **endptr, int base);

nptr是需要进行转换的目标字符串,endptr一般设置为NULL,base是数字基数,介于2-36之间,含两端点。base=2,合法字符就是‘0’、‘1’;base=36,合法字符就是‘0’、‘1’、… ‘z’。
strtoul()和strtoull()函数的返回类型分别是unsigned long int和unsigned long long int。

#include 
unsigned long int strtoul(const char *nptr, char **endptr, int base);
unsigned long long int strtoull(const char *nptr, char **endptr, int base);

用于字符串转浮点型数据的函数有atof()、strtod()、strtof()、strtold()。
atof()用于将字符串转换为一个double类型的浮点数据。strtof()、strtod()以及strtold()三个库函数可分别将字符串转换为float类型数据、double类型数据、long double类型数据。

#include 
double atof(const char *nptr);
float strtof(const char *nptr, char **endptr);
double strtod(const char *nptr, char **endptr);
long double strtold(const char *nptr, char **endptr);

数字转字符串

数字转换为字符串使用sprintf()或snprintf()函数。

#include 
int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const char *format, ...);

str是数字转换后要存放的缓冲区,format是格式,根据数字类型以"%"的形式,后面是可变参数,一般跟要转换的字符串。
简单的转换例子如下。

char str[20] = {0};
sprintf(str, "%d", 500);
sprintf(str, "%f", 500.111);
sprintf(str, "%u", 500);

参考资料:
I.MX6U嵌入式Linux C应用编程指南V1.4——正点原子

你可能感兴趣的:(Linux,1024程序员节,linux)