字符串处理

标签:c++


一、输入

1、 scanf()函数

格式:scanf(“%s”,arryName)

注意:录入时遇到空白字符(空格、回车、制表)即结束

2、 gets()函数

格式:gets(char *ch)

注意:

  • 读取整行内容,包括空格和制表,只在遇到回车时结束
  • 只能读取字符数组,不能读string对象

3、 getchar()函数

格式:

int ch[N];(设为char ch[N]也可以)
while((ch[i++] = getchar()) != 32 && (ch[i++] = getchar()) != '\n');
ch[i-1] = '\0';

注意:

  • 函数获取的是整型,即字符的十进制ASCII码
  • 每次仅读入一个字符,读取字符串时要循环读取,通过循环条件限制读取内容,并在字符串末尾添加’\0’
  • 空白符ASCII码:空格:32,制表:9,换行:10

二、输出

1、 printf()函数

格式:printf(“格式控制符”,ch)

2、 puts()函数:

格式:puts(arryName)

3、 putchar()函数

putchar(变量名或者表达式)

变量可以是字符型或者整型,输出结果一定为字符型

三、cin()cout()

1、 基本格式:

cin>>arryName

cout<<arryName

2、 注意:

  • cin遇到空白字符就停止接收,如果后面还有接收语句,则余下的部分被赋值给下一个变量,如果需要接收空格,使用cin.getline(stringName, size)函数,最多只可以读入size-1个字符,多余的不接收
  • 使用getline(cin, str)语句时,必须用getchar()将之前输入的\n接收掉!!!否则第一次接收的字符串是空白的
  • cin()/cout()的运行速度比scanf()/printf()慢,尽量减少使用

四、字符数组和string()对象

1、 字符数组

(1) 数组定义:

char stringName[N];

cin/scanf/gets读入时末尾自动添’\0’

不能用字符数组和字符指针直接赋值,只能用字符串常量赋值

只要不发生内存溢出,可以任意访问字符数组中的内容,只是内容为乱码

(2) 字符指针定义:

char *pStr;

可以在定义时赋值,也可以在定义后使用前赋值

赋值方式为:字符串常量、字符数组、字符指针,但不能是string对象

2、 string对象

(1) string对象的定义:

对象:

string valName;

如:

char szString[100] = "huiahgigh";
char *p1 = "jiahgi";
string str = "hhuihs";
string str1 = szString, str2 = p1, str3 = str;

对象数组:

string arrayName[N];

定义时可以初始化

初始化内容为:字符串常量、字符数组、字符指针、string对象

(2) 输入输出

  1. cin>>stringName;

char szString[N];
scanf(“%s”,szString);
stringName = szString;
char szString[N];
gets(szString);
stringName = szString;

(3) 赋值

可以用字符常量、字符串常量、字符数组、字符指针、string对象进行赋值,不需要考虑长度

(4) string对象的运算

支持<,<=,==,>=,>,+,+=,[]运算符,意义同相应的字符串处理函数,string对象比较大小时按照字典顺序比较,大小写相关,大写字母小于小写字母

(5) string中常用函数

string对象详解

to_string(),stoi,stof

五、字符串处理函数

1、包含在string.h或者cstring头文件中

2、 注意函数返回值!!!

  • strlen()函数

    char* str = "12345";
    int len = strlen(str);
    printf("len = %d\n", len);

    该函数是计算字符串长度的函数,但不包含字符串结尾的’\0’

  • strcat strncat 函数

    char str1[10] = {'1','2','3'};
    char str2[5] = {'x','y','z','w'};
    strcat(str1, str2);//把str2追加到str1的后面
    strncat(str1, str2, sizeof(str1) – strlen(str1) - 1);//把str2追加到str1的后面,最后一个参数是str1剩余的长度。
    printf("string = %s\n", str1);
    • 这两个函数都是拼接字符串的函数。
    • str1一定要有足够的空间来放str2,不然会内存溢出。
    • strncat 函数比 strcat 函数更安全。
  • strcmp strncmp 函数

    char* str1 = "hello";
    char* str2 = "hellojj";
    int result1 = strcmp(str1, str2);//比较两个字符串
    printf("result1 = %d\n", result1);
    int result2 = strncmp(str1, str2, 5);//最后一个参数代表,比较两个字符串的前n个
    printf("result2 = %d\n", result2);
    • strcmp 函数,如果两个字符串相同,则返回0,否则为非0
    • strncmp 函数,最后一个参数代表比较的前n个字符,如果两个数前n个相同则返回0,否则为非0(大于为正,小于为负)
  • strcpy strncpy 函数

    char strBuf[20] = {0};
    char* str = "hello devbird";
    strcpy(strBuf, str);//将str中的字符串拷贝到strBuf中
    printf("strBuf = %s\n", strBuf);
    strncpy(strBuf, str, 8);//将str中的前8个字符拷贝到strBuf中
    printf("strBuf = %s\n", strBuf);
    • 两个函数都是拷贝字符串函数,有缓冲区溢出危险。
    • strncpy 最后一个参数代表要拷贝的字符数。
  • sprintf 函数

    char buf[50];
    sprintf(buf, "我有%d块钱!", 100);
    printf("buf = %s\n", buf);//输出结果:buf = 我有100块钱!
    • printf是向屏幕输出一个字符串。
    • sprintf是向char数组输出一个字符串,其他行为和printf一模一样。
    • sprintf也存在缓冲区溢出的问题。
  • strchr 函数

    char* str = "devbird";
    char* result = strchr(str, 'b');
    printf("result = %s\n", result);//结果:result = bird
    char* res = strchr(str, 'z');
    printf("res = %s\n", res);//结果:res = (null)

    该函数是查找字符的函数,如果能找到则返回当前字符及其后面的字符,否则返回为null

  • strstr 函数

    char* str = "I am a Android developer!";
    char* subStr = "Android";
    char* result = strstr(str, subStr);
    printf("result = %s\n", result);//结果:result = Android developer!

    该函数是查找子字符串,返回值为子字符串第一次出现的位置及其后面的字符串,如果没查找到则返回为NULL

  • strtok 函数

    char str[] = "2016/08/29 20:06:55";
    char* result = strtok(str, "/");
    while (result)
    {
    printf("result = %s\n", result);//结果:result = 2016
    // result = 08
    // result = 29 20:06:55
    result = strtok(NULL, "/");
    }

    字符在第一次调用时strtok()必需给予参数str字符串,往后的调用则将参数str设置成NULL,每次调用成功则返回指向被分割出片段的指针。

  • atoi函数

    char* str = "123";
    int i = atoi(str);
    printf("i = %d\n", i);//输出:i = 123

    该函数是一个将数字字符串转换成int类型的函数。

  • atof 函数

    char* str = "29.3547";
    float f = atof(str);
    printf("f = %f\n", f);//输出:f = 29.354700

    该函数是将一个数字字符串转换成float类型的函数。

  • atol 函数

    char* str = "31465666";
    long l = atof(str);
    printf("ld = %ld\n", l);//输出:ld = 31465666

    该函数是将数字字符串转换成长整型的函数。

【C++】字符串处理的更多相关文章

  1. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  2. 测试一下StringBuffer和StringBuilder及字面常量拼接三种字符串的效率

    之前一篇里写过字符串常用类的三种方式<java中的字符串相关知识整理>,只不过这个只是分析并不知道他们之间会有多大的区别,或者所谓的StringBuffer能提升多少拼接效率呢?为此写个简 ...

  3. java中的字符串相关知识整理

    字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...

  4. JavaScript 字符串实用常操纪要

    JavaScript 字符串用于存储和处理文本.因此在编写 JS 代码之时她总如影随形,在你处理用户的输入数据的时候,在读取或设置 DOM 对象的属性时,在操作 Cookie 时,在转换各种不同 Da ...

  5. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  6. Redis的简单动态字符串实现

    Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,sds)的抽象类 ...

  7. ASP.NET加密和解密数据库连接字符串

    大家知道,在应用程序中进行数据库操作需要连接字符串,而如果没有连接字符串,我们就无法在应用程序中完成检索数据,创建数据等一系列的数据库操作.当有人想要获取你程序中的数据库信息,他首先看到的可能会是We ...

  8. Javascript正则对象方法与字符串正则方法总结

    正则对象 var reg = new Regexp('abc','gi') var reg = /abc/ig 正则方法 test方法(测试某个字符串是否匹配) var str = 'abc123'; ...

  9. 微信小程序中利用时间选择器和js无计算实现定时器(将字符串或秒数转换成倒计时)

    转载注明出处 改成了一个单独的js文件,并修改代码增加了通用性,点击这里查看 今天写小程序,有一个需求就是用户选择时间,然后我这边就要开始倒计时. 因为小程序的限制,所以直接选用时间选择器作为选择定时 ...

  10. ThinkPHP+Smarty模板中截取包含中英文混合的字符串乱码的解决方案

    好几天没写博客了,其实有好多需要总结的,因为最近一直在忙着做项目,但是困惑了几天的Smarty模板中截取包含中英文混合的字符串乱码的问题,终于解决了,所以记录下来,需要的朋友看一下: 出现乱码的原因: ...

随机推荐

  1. C# Dispose模式

    需要明确一下C#程序(或者说.NET)中的资源.简单的说来,C#中的每一个类型都代表一种资源,而资源又分为两类: 托管资源:由CLR管理分配和释放的资源,即由CLR里new出来的对象: 非托管资源:不 ...

  2. 『学了就忘』Linux日志管理 — 91、日志服务rsyslogd说明

    目录 1.日志文件格式 2.rsyslogd服务的配置文件 (1)rsyslog.conf文件内容 (2)rsyslog.conf配文件内容说明 (3)定义自己的日志 1.日志文件格式 只要是由日志服 ...

  3. 如何在Uni-app中通过腾讯IM SDK实现社交应用和直播互动等功能

    Uni-app想开发社交应用.IM.店铺客服.嵌入式社交模块.在线直播互动,这些功能Uni-app官方也没提供SDK,怎么办呢?找IM老大腾讯云啊,今天我们就在Uni-app中把腾讯云即时通讯TXIM ...

  4. cmake指定程序输出目录和库文件输出目录和拷贝文件

    概述 本文样式环境: win10+cmake 3.18 本文将介绍使用CMAKE配置项目输出目录和 LIbrary项目的输出目录 本文将介绍 cmake的file函数的基础用法之拷贝文件 重点, 这些 ...

  5. ubuntu下载源码clang + llvm+lldb 编译+安装

    [本文可能涉及到Ubuntu安装以下工具:] A.g++ B.gcc C.make D.cmake E.clang(10.0.1)(必须) F.llvm(10.0.1)(必须) G.lldb(10.0 ...

  6. 【LeetCode】1221. Split a String in Balanced Strings 解题报告 (C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 统计 日期 题目地址:https://leetcode ...

  7. 【LeetCode】829. Consecutive Numbers Sum 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数学方法 日期 题目地址:https://leetc ...

  8. 【死磕Java并发】-----Java内存模型之重排序

    在执行程序时,为了提供性能,处理器和编译器常常会对指令进行重排序,但是不能随意重排序,不是你想怎么排序就怎么排序,它需要满足以下两个条件: 在单线程环境下不能改变程序运行的结果: 存在数据依赖关系的不 ...

  9. XSLT映射文件函数

    任何的编程语言或者是SQL语句都有内置的函数或方法,而强大灵活的xslt技术也是如此.熟练掌握XSLT的常用函数的用法,XSLT的应用将变得如此轻松,你会发现XSLT比想象中还要牛!以下是xslt数值 ...

  10. RabbitMQ 七种队列模式

    (1)简单模式(Hello World) 做最简单的事情,一个生产者对应一个消费者,RabbitMQ相当于一个消息代理,负责将A的消息转发给B 应用场景: 将发送的电子邮件放到消息队列,然后邮件服务在 ...