字符串操作常用函数
- 字符串的常用操作函数
- puts()
- gets()
- strlen()
- memset()
- strcpy() 和 strncpy()
- strcat()
- strcmp()
- strchr() 和 strstr()
- strlwr() 和 strupr()
- strtok()
字符串的常用操作函数
puts() //输出字符串
gets() //获取字符串
strlen() //计算字符串长度
memset() //初始化
strcpy() strncpy() //字符串的拷贝
strcat() //字符串的拼接
strcmp() //字符串的比较
strchr() strstr() //字符串的查找
strtok() //字符串分割
strlwr() strupr() //字符串转为小写和字符串转为大写
puts()
puts()函数用来向标准输出设备(屏幕)输出字符串并换行,具体为:把字符串输出到标准输出设备,将’\0’转换为回车换行。其调用方式为,puts(s);其中s为字符串字符(字符串数组名或字符串指针)。
函数原型:
int puts(const char *string);
示例:
#include <stdio.h>
#include <string.h>
int main()
{
char *a="hello,word!";
puts(a);
return 0;
}
运行结果:
printf、putchar和puts函数的区别
puts和printf("%s",s)的功能差不多,不同之处在于puts自带换行。
printf、putchar和puts函数均为输出函数。printf函数可输出各种不同类型的数据,putchar函数只能输出字符数据,而puts函数可输出字符串数据。
puts(s)的作用与语句printf("%s”,s)的作用基本相同,puts()函数只能输出字符串,不能输出数值或进行格式变换。puts()函数在输出字符串后会自动输出一个回车符。
例如:
printf("%c",‘A’) 与putchar(‘A’)都是输出一个字符A。
printf("%s\n",“abc”)与puts(“abc”)都是输出字符串abc并换行。
gets()
gets从标准输入设备读字符串函数,其可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。
函数原型:
char * gets ( char * str );
当gets()函数和指针搭配使用要注意:
-
野指针,会造成非法内存访问,出现段错误,cmd窗口闪退。
-
一定要申请空间,常用malloc函数申请空间和memset函数初始化,但要注意内存泄漏的问题,malloc申请空间可能会失败,要返回值做判断。
示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *b=NULL;
printf("请输入字符串:\n");
b=(char *)malloc(128);
if(b==NULL)
{
printf("内存申请失败\n");
exit(-1);
}
memset(b,'\0',128);
gets(b);
puts(b);
return 0;
}
运行结果:
strlen()
详情请看我之前写的博文:
6.字符数组 & 字符串 & sizeof和strlen的区别
memset()
作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。这个函数通常为新申请的内存做初始化工作。
函数原型:
#include <string.h>
void *memset(void *s, int ch, size_t n);
示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *b=NULL;
printf("请输入字符串:\n");
b=(char *)malloc(128);
if(b==NULL)
{
printf("内存申请失败\n");
exit(-1);
}
memset(b,'\0',128); //初始化为‘\0’
gets(b);
puts(b);
return 0;
}
运行结果:
strcpy() 和 strncpy()
strcpy()
功能:
C 库函数 char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest。
需要注意的是如果目标数组 dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况。
函数原型:
char *strcpy(char* dest, const char *src);
参数:dest为目标字符串,src为原字符串。
返回值:目标串的地址。
代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char c[]={'\0'};
char *d="nice work";
strcpy(c,d);
printf("strcpy:%s\n",c);
return 0;
}
运行结果:
strncpy()
功能:
C 库函数 char *strncpy(char *dest, const char *src, size_t n) 把 src 所指向的字符串复制到 dest,最多复制 n 个字符。当 src 的长度小于 n 时,dest 的剩余部分将用空字节填充。
函数原型:
char *strncpy(char *destinin, char *source, int maxlen);
参数:
-
destinin:表示复制的目标字符数组。
-
source:表示复制的源字符数组。
-
maxlen:表示复制的字符串长度。
返回值:目标串的地址。
代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char pstr1[128] = "good job!";
char *pstr2 = "nice work!";
strncpy(pstr1,pstr2,4);
printf("strncpy = %s\n",pstr1); //将pstr2的前三个字符拷贝到pstr1前三个位置
return 0;
}
当拷贝目标为指针时:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *pstr1 = NULL;
char *pstr2 = "nice work!";
pstr1=(char *)malloc(128);
if(pstr1==NULL)
{
printf("内存申请失败\n");
exit(-1);
}
memset(pstr1,'\0',10);
strncpy(pstr1,pstr2,4);
printf("strncpy = %s\n",pstr1);
return 0;
}
运行结果:
将pstr2的前三个字符拷贝到pstr1前三个位置。
当拷贝目标为指针时:
strcat()
把src所指向的字符串(包括 ‘\0’ )复制到dest所指向的字符串后面(删除dest原来末尾的 ‘\0’ )。要保证dest足够长,以容纳被复制进来的*src。*src中原有的字符不变。返回指向dest的指针。
函数原型:
extern char *strcat(char *dest, const char *src);
示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char a[128]="China ";
char *b="good job!";
strcat(a,b);
printf("strcat : %s\n",a);
return 0;
}
运行结果:
strcmp()
strcmp函数,用于比较两个字符串并根据比较结果返回整数。基本形式为strcmp(str1,str2)。若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。
函数原型:
extern int strcmp(const char *s1,const char *s2);
代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char a[128]="China ";
char *b="good job!";
int ret=strcmp(a,b);
printf("strcmp返回值:%d\n",ret);
return 0;
}
运行结果:
strchr() 和 strstr()
strchr()
作用:strchr函数功能为在一个串中查找给定字符的第一个匹配之处。
函数原型:
char *strchr(const char *str, char c)
参数:
str:要被检索的 C 字符串。
c:在 str 中要搜索的字符。
返回值:
返回一个指向该字符串中第一次出现的字符的指针,如果字符串中不包含该字符则返回NULL空指针。
代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char a[128]="We are the champion!";
char b='a';
char *c=NULL;
c=strchr(a,b);
if(c!=NULL)
{
printf("%s\n",c);
//puts(strchr(a,b));
}
else
{
printf("没有找到该字符\n");
}
return 0;
}
运行结果:
strstr()
作用:
返回字符串中首次出现子串的地址。
函数原型:
extern char *strstr(char *str1, const char *str2);
参数:
str1: 被查找目标。
str2: 要查找对象。
返回值:
若str2是str1的子串,则返回str2在str1的首次出现的地址;如果str2不是str1的子串,则返回NULL。
strchr() 和 strstr() 的区别在于:
strchar() 是在 str 中搜索的字符。
strstr() 是在 str 中搜索字符串。
代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char a[128]="We are the champion!";
char *b="the";
char *c=NULL;
c=strstr(a,b);
if(c!=NULL)
{
printf("%s\n",c);
//puts(strchr(a,b));
}
else
{
printf("没有找到该字符\n");
}
return 0;
}
运行结果:
strlwr() 和 strupr()
strlwr()
功能:将字符串中的S参数转换为小写形式。
函数原型:
extern char *strlwr(char *s);
返回值:返回指向s参数的指针。
代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char a[128]="Hello Word!";
puts(strlwr(a));
return 0;
}
运行结果:
strupr()
功能:将字符串s转换为大写形式。
函数原型:
extern char *strupr(char *s);
返回值:返回指向s参数的指针。
代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char a[128]="Hello Word!";
puts(strupr(a));
return 0;
}
运行结果:
strtok()
功能:分解字符串为一组字符串。
函数原型:
char *strtok(char *str, const char *delim);
参数:
str:要被分解成一组小字符串的字符串。
delim:包含分隔符的 C 字符串。
返回值:
该函数返回被分解的第一个子字符串,如果没有可检索的字符串,则返回一个空指针。
注意:从第2次开始目标字符串要改为NULL。
代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char a[128]="Yinyuer,is,a,pretty,girl,!";
char *b=",";
char *c=NULL;
int i=1;
c=strtok(a,b);
if(c!=NULL)
{
printf("第1个字符串为 %s\n",c);
}
c=strtok(NULL,b);
//从第二次开始目标字符串要改为NULL
if(c!=NULL)
{
printf("第2个字符串为 %s\n",c);
}
c=strtok(NULL,b);
if(c!=NULL)
{
printf("第3个字符串为 %s\n",c);
}
c=strtok(NULL,b);
if(c!=NULL)
{
printf("第4个字符串为 %s\n",c);
}
c=strtok(NULL,b);
if(c!=NULL)
{
printf("第5个字符串为 %s\n",c);
}
c=strtok(NULL,b);
if(c!=NULL)
{
printf("第6个字符串为 %s\n",c);
}
c=strtok(NULL,b);
if(c!=NULL)
{
printf("第7个字符串为 %s\n",c);
}
else
{
printf("分割完毕\n");
}
return 0;
}
上面的代码显得有点啰嗦,我们来优化一下代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char a[128]="Yinyuer,is,a,pretty,girl,!";
char *b=",";
char *c=NULL;
int i=1;
c=strtok(a,b);
printf("第%d个字符串为 %s\n",i,c);
while(1)
{
c=strtok(NULL,b);
if(c!=NULL)
{
printf("第%d个字符串为 %s\n",++i,c);
}
else
{
printf("分割完毕\n");
break;
}
}
return 0;
}
运行结果:
Salute to 老陈!