说明:字符串处理的函数很多,本文将例举经常遇到的一些函数加以说明。

一.字符串的输入输出

头文件:<stdio.h>

1.利用标准输出函数 printf() 来输出,将格式设置为 s% 。特点:在遇到字符串的结束标记 ’\0’ 会停止输出到屏幕。如下代码,打印输出为 abc 。

 printf("%s\n","abc\0efg");

2.int puts(const char *_Str) 向屏幕输出,成功返回0,失败返-1,特点:自动追加换行,同样遇到 ‘\0’ 会截止输出。举例:

 puts("abc\0d");

3.利用标准输入函数 scanf() 来输入,特点:遇到空格截止输入,要注意输入越界。在正常(不越界)的情况下,该函数会在输入的字符串后面自动追加结束标记 ’\0’ 。如下代码,若输入为 abc def 则打印 p 的内容时为 abc。

     char p[10];
//注意越界,输入字符数最多为10
scanf("%s",p);

4.char *gets(char *str) 从标准输入流中读取字符串。特点:gets 直到遇到回车或 EOF 才停止输入,空格也作为字符输入,读取成功返回 str ,失败返回 NULL。同样要注意越界问题。读取完成后同样在输入字符串的后面追加 ’\0’ 。

如下代码,若输入为:abc def,则打印出两行一样的字符串:abc def。

     char p[10];
char *q = gets(p);
puts(q);
puts(p);

二.字符串基本操作函数

头文件:<string.h>

1.size_t strlen ( const char * str )  求取字符串 str 的长度,并返回。需要注意的是这个函数是以字符串的结束标志 ‘\0’来判断字符串结束的。如下代码,打印出的长度为 2 而不是 5 。注意:size_t == unsigned int 。

     char *p = "ch\0na";
int n = strlen(p);
printf("%d\n",n);

2.char * strcat ( char * dest, const char * src )  追加 src 串到 dest 的末尾,dest 的末尾的'\0'字符,会被 src 的第一个字符所覆盖,追加完成后的新串会被在其末尾自动追加'\0',并返回该新串(注意越界)。如下代码,打印 s 为 chinajim 。

     char p[30] = "china";
char q[10] = "jim";
char *s = strcat(p,q);
puts(s);

3.char * strcpy ( char * dest, const char * src ) 拷贝 src 所指向的字符串,到 dest 所指向空间中去,包含 src 中的结束符'\0'。返回值为 dest (注意越界)。

     char p[30] = "china";
char q[10] = "jim";
char *s = strcpy(p,q);
puts(s);
puts(p);

4.int strcmp ( const char * str1, const char * str2 ) 比较字符串 str1 和字符串 str2 的大小。该函数从两字符串的第一个字符开始,如果相等,依次往下比较,直到遇到不相同的字符或其中一个遇到 '\0' 。比较的依据,是两字符对应的 ASCII 值的大小,若大于返回 1,小于返回 -1,等于返回 0。

     char p[30] = "chinj";
char q[10] = "chinc";
int n = strcmp(p,q);
printf("%d\n",n);

三.字符串处理安全操作

头文件:<string.h>

说明:前面提到的字符串处理函数大多都存在一个问题,就是越界问题。比如当拷贝一个字符串到一个字符数组时,当字符数组的空间不够,则会发生越界问题。越界问题是很危险的,有时会出现难以预料的后果,比如系统崩溃。为此,C语言还提供了一些更为安全的字符串处理函数。

1.char *strncat(char * s1,const char * s2,size_t n)  将 s2 字符串的前 n 个字符追加到 s1 字符串,复制过来的 s2 字符串的第一个字符覆盖 s1 字符串结尾的 ‘\0’,最后在 s1 末尾追加 ‘\0’。打印结果为 chinachi。

     char p[30] = "china";
char q[10] = "china";
char *s = strncat(p,q,3);
printf("%s\n",s);

2.char * strncpy ( char * destination, const char * source, size_t num ) 拷贝 source 中的前 num 个字符到 destination 中去。如果在拷贝 num 个字符中遇到 ’\0’ ,则不再继续拷贝,在其后补 ’\0’ ; 如果 source 的长度大于 num,在拷贝完 num 个字符后,并不会在 destination 的后面追加’\0’。所在这种情况下,destination 不以’\0’结尾,读它可能会越界。

解决办法是,依据 dest 的大小,假设设为 N,然后去读 N-1 个字符。然后将 dest[N-1] = ‘\0’ ;千万不可忘记拷贝完成后加 ‘\0’ 。

     char p[5] = "china";
char q[5] = "anihc";
char *s = strncpy(p,q,sizeof(p)-1);
p[4] = '\0';
printf("%s %s\n",p,s);

3.int strcmp(char *str1,char * str2,int n)  比较字符串 str1 和 str2 的前 n 个字符,该函数从两字符串的第一个字符开始,如果相等,依次往下比较,直到比较完前 n 个字符 。比较的依据,是两字符对应的 ASCII 值的大小,返回值为ASCII码值的差。如下打印结果为 8。

     char p[5] = "9chin";
char q[5] = "1fnih";
int n = strncmp(p,q,5);
printf("%d",n);

4.int sprintf ( char * str, const char * format, ... )  把格式化的数据写入某个字符串缓冲区。比如下面代码:输入 12.34.54.65,输出 12.34.54.65 。

     int a,b,c,d;
printf("pls input ip:");
scanf("%d.%d.%d.%d",&a,&b,&c,&d);
char buf[17];
sprintf(buf,"%d.%d.%d.%d",a,b,c,d);
printf("%s\n",buf);

四.字符串与数值之间的转化

头文件:<stdlib.h>

1.int atoi(const char *nptr) 将字符串转换成整型数;atoi()会扫描参数 nptr 字符串,跳过前面的空格字符,直到遇上数字或正负号才开始做转换,而再遇到非数字或字符串时('\0')才结束转化,并将结果返回(返回转换后的整型数)。如下程序输出:data = 123 (换行)a –b = –1 。

         char buf[100] = " 123abc";
int data = atoi(buf);
printf("data = %d\n",data);
char a[] = "-100";
char b[] = "";
printf("a -b = %d\n",atoi(a)+atoi(b));

2.char * itoa ( int value, char * str, int base ) 根据指定的进制(base),将整型数据转化为以 ’\0’ 结尾的字符串,保存到 str 指向的字符数组中,并返回。

     char buf[100];
int a = 123;
char * q = itoa(a,buf,10);
printf("q = %s\n",q);
printf("base 10 %s\n",buf);
itoa(a,buf,16);
printf("base 16 %s\n",buf);
itoa(a,buf,2);
printf("base 2 %s\n",buf);

输出结果:

五.字符串的其他处理函数

头文件 <string.h>

1.char *strchr(char* str,int ch)  返回字符串 str 中首次出现字符 c 的位置指针,返不到返回 NULL。

 char buf[100] = "china";
char *p = strchr(buf,'n');

2.char * strstr ( char * str1, const char * str2 ) 搜索字符串 str2 在字符串 str1 中是否出现。若找到,则该函数返回第一次匹配的字符串的地址;如果未找到所搜索的字符串,则返回 NULL。

     char str1[] = "abcd123456efg";
char str2[] = "";
char *pf = strstr(str1,str2);

如下代码将统计 str2 字符串在 str1中出现的次数:

     char *str1 = "aaaaaaaaaaaaaaaaa";
char *str2 = "aa";
int count = 0;
while((str1 = strstr(str1,str2)) != NULL)
{
count++;
str1 = str1+strlen(str2);
}
printf("%d\n",count);

3.char *strtok(char *s, char *delim) 分解字符串为一组字符串。s 为要分解的字符串,delim 为分隔符。首次调用时,s 指向要分解的字符串,之后再次调用要把 s 设成 NULL。该函数返回从 s 开头开始的一个个被分割的串。当没有被分割的串时则返回 NULL。所有 delim 中包含的字符都会被滤掉,并将被滤掉的地方设为一处分割的节点。

     char buf[] = "aaaaaaaaaa@bbbbbbbbbbbb@ccccccccccc@ddddddddd";
char delim[] = "@";
printf("%s\n",buf);
char *q = strtok(buf,delim);
while(q )
{
printf("%s\n",q);
q = strtok(NULL,delim);
}

程序运行结果:

(C/C++学习)13.C语言字符串处理函数(一)的更多相关文章

  1. (C/C++学习)14.C语言字符串处理函数(二)

    说明:上节着重解释了字符串处理的库函数处理,这节将针对一些常用的需求,进行非库函数的处理. 一.去除某一个字符串中的某个字符 1.去除字符串右边的空格 void trimStrRightSpace(c ...

  2. 转:C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文

    转自:C语言字符串操作函数 - strcpy.strcmp.strcat.反转.回文 C++常用库函数atoi,itoa,strcpy,strcmp的实现 作者:jcsu C语言字符串操作函数 1. ...

  3. Strsafe.h:更安全的C语言字符串处理函数

    原文出处:Strsafe.h: Safer String Handling in C 作者:Michael Howard 编译:王凌峰 在微软公司举行的Microsoft Windows Securi ...

  4. C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文

    原文:http://www.cnblogs.com/JCSU/articles/1305401.html C语言字符串操作函数 1. 字符串反转 - strRev2. 字符串复制 - strcpy3. ...

  5. C语言字符串处理函数

    函数名: strcpy  功  能: 拷贝一个字符串到另一个  用  法: char *stpcpy(char *destin, char *source);  程序例:  #include < ...

  6. C语言字符串操作函数整理

    整理C语言字符串相关的函数,以程序方式验证,以注释方式做说明. #include<stdio.h> #include<string.h> #include<stdlib. ...

  7. C语言字符串操作函数

    1.函数名: stpcpy  功  能: 拷贝一个字符串到另一个  用  法: char *stpcpy(char *destin, char *source);  程序例: #include < ...

  8. C++语言字符串处理函数

    C++语言提供了比C语言更丰富的字符串处理功能.它可以在字符串上经行输入,输出,合并,修改,比较,转换,复制,搜索等操作.使用这些现成的功能可以大大减少我们的编程的负担. 输入和输出的字符串函数,如p ...

  9. GO学习-(12) Go语言基础之函数

    Go语言基础之函数 函数是组织好的.可重复使用的.用于执行指定任务的代码块.本文介绍了Go语言中函数的相关内容. 函数 Go语言中支持函数.匿名函数和闭包,并且函数在Go语言中属于"一等公民 ...

随机推荐

  1. Powershell远程在Azure A7虚拟机执行Java JVM失败

    近期.使用Powershell脚本在A7 (8核,56G内存)配置的 Azure VM(Virtual Machine.虚拟机)上远程运行Java JVM时 (java.exe -version).总 ...

  2. Android开源框架ViewPageIndicator和ViewPager实现Tab导航

    前言: 关于使用ViewPageIndicator和ViewPager实现Tab导航,在开发社区里已经有一堆的博客对其进行了介绍,假设我还在这里写怎样去实现.那简直就是老生常谈,毫无新奇感,并且.我也 ...

  3. MCU低功耗设计(三)产品

    关键词: 低功耗设计, 无线通信产品, LoRa长距离, Contiki系统, 能耗实时跟踪 引言: 能耗对电池供电的产品来说是一个重大问题.一旦电能耗尽设备将"罢工".在< ...

  4. java 多线程——并发编程模型 学习笔记

                                                                                                 并发编程模型 ...

  5. 48.EXt.Data.JsonReader()

    转自:https://blog.csdn.net/huoyanxueren/article/details/2662915?utm_source=blogxgwz6 extJs 2.1学习笔记(Ext ...

  6. akka监控

    使用akka系统时间就了,你就一定会想着监控的事儿.比如某个actor发送了多少消息.接收了多少消息.消息平均处理时间是多少,当前有多少个actor等等.本来我都用bytebuddy写了个简单的akk ...

  7. 自动调整速率的Actor设计模式

    问题背景 与数据库或者存储系统交互是所有应用软件都必不可少的功能之一,akka开发的系统也不例外.但akka特殊的地方在于,会尽可能的将所有的功能都设计成异步的,以避免Actor阻塞,然而无法避免IO ...

  8. c++ pow函数

    函数名称:   pow 函数原型:   double pow( double x, double y ); 函数功能:   计算x的y次幂 例:z=pow(x,y);    x=9,y=8  z就是9 ...

  9. BZOJ 1845 Simpson积分

    思路: Simpson积分直接上  限制一下递归深度+精度就好了 (难以理解为什么这么多人写扫描线) //By SiriusRen #include <bits/stdc++.h> usi ...

  10. 【知识总结】快速傅里叶变换(FFT)

    这可能是我第五次学FFT了--菜哭qwq 先给出一些个人认为非常优秀的参考资料: 一小时学会快速傅里叶变换(Fast Fourier Transform) - 知乎 小学生都能看懂的FFT!!! - ...