C++字符串

C++字符串

上节我们讲了两种类型的常量。C++两种类型的常量

本节我们介绍关健的字符串。本节较长,可使用目录跳过:

  • 什么是字符串: 字符串就是0个或者多个“字符”组成的“有序”序列
    由字符组成:例如“man”,“woman”等按照特定顺序组成的。
  • 字符串长度:
    字符串包含的字符个数(英文字符)
    “”是空字符串常量,没有一个字符,长度为0
    “ ”是空格字符串常量,包含一个空格,长度为1
    “chat”的字符串长度是4
    “聊天”的字符串长度不是2,是4或6(某些编码中汉字占两个字节,有些是三个字节)
  • 字符串常量: 之前也提到过,用英文双引号括起来的字符串。例如:“聊天”,“玩”等
  • 字符串结束符:
    在C语音中,为了便于储存字符串,要求在最后一个字符的后面存储一个0(一个字节)。
    这个0称为字符串结束符,常用‘\0’表示。
    例如:”man“ 就是’m’,‘a’,n’,’\0’。
    注意: C++的字符串最后面并没有字符串结束符!即string
    实际存储时,根据编译器的不同,最后可能储存0也可能没有。
  • 字符串变量的表示:
    在C语言中,使用char类型的数组,来储存字符串变量。
    注:C语言中,没有专用的字符串类型。
    在C++中,使用std::string来定义字符串变量。

string变量的定义、初始化

  • 需要使用string类型,需要包含头文件#include<string>

    #include<iostream>
    #include<string>
    
    int main(){
        //情况一
        //定义一个字符串,此时它的值为空,即空字符串
        std::string name1;
        //给字符串赋值,即拷贝字符串到变量
        name1 = "老王";
        std::cout << "名字:" << name1 << std::endl;
    	
        //情况二
    	//定义一个字符串表示绰号
        std::string name2;
        //将name1的值拷贝给name2;
        name2 = name1;
        std::cout << "名字:" << name2 << std::endl;
        
        //第三种赋值情况,创建对象的用法!(以后在讲)
        //把值设置为“老王”
        //说明:定义变量的同时,设置一个值,一般称为“初始化”
    	std::string name3("老张");
        std::cout << "名字:" << name3 << std::endl;
        
        //情况四
        std::string name4(name3);
        std::cout << "名字:" << name4 << std::endl;
        
        //情况五,,不常用
        //表示用10个字符B组成字符串
        //等效于std::string name5("BBBBBBBBBB")
        std::string name5(10, 'B');
        std::cout << "名字:" << name5 << std::endl;
        
        return 0;
    }
    

    输出结果:

    名字:老王
    名字:老王
    名字:老张
    名字:老张
    名字:BBBBBBBBBB
    
  • 上面出现了string变量的五种定义、初始化的情况,情况一到四使用普遍,效果相同。
    对上面出现的情况进行详细分析:

    • 情况一:

      //将老王赋值给一个新定义的字符串变量
      std::string name1;
      name1 = "老王";
      等效于 std::string name1 = "老王";

    • 情况二:
      拷贝name1name2
      std::string name2 = name1;

    • 情况三:
      使用另一种方式将"老张"赋值给name3
      std::string name3("老张");

    • 情况四:
      拷贝name3name4
      std::string name4(name3);

    • 情况五:(不常用)
      给name5赋值10个B
      std::string name5(10, 'B');
      等效于std::string name5 = "BBBBBBBBBB";

string变量的输入和输出

  • 使用std::cin >> 输入

    从第一个非空白字符开始,直到遇到空白字符时停止输入
    空白字符是指:空格、制表符、回车符

  • 使用std::cout << 输出

#include<iostream>
#include<string>

using namespace std;

int main(){
	string name; //姓名
    string favorite; //爱好
    
    //输入与输出
    //从第一个非空白字符(空格,制表符,回车)开始,直到遇到空白字符为止。
    cout << "你的名字是什么?" << endl; //控制台输出
    cin >> name; // 控制台输入
    cout << "叫" << name << ", 真是个不错的名字。" << endl;
    cout << "那你的爱好呢?";
    cin >> favorite;
    cout << "巧了,我也喜欢" << favorite << endl;
    
    return name;
}
  • 上面进行了字符串的输入与输出。
    • 输出按照格式输出
    • 输入时:如果输入 王五"空白字符"唱歌
      那么name的值为”王五“, favorite的值为”唱歌“。
      注意: 如果输入 王“空格”五"空格"唱”空格“歌
      那么name的值为王,favorite的值为五。
      唱 歌 被存在了键盘缓冲区,直到被下一个变量接收,或者程序结束
  • 下面看一个要求:连续输入多个字符串,且输入的字符串个数不确定。
    直到输入结束时(按下ctrl + z 并回车
#include<iostream>
#include<string>

using namespace std;

int main(){
	
    string food;//食物
    
    int count = 0; 
    
    //需要使用循环语句
    //当括号里面的条件为真时,进行循环
    //使用 cin >> 输入时,如果遇到文件结束符(ctrl + z),就返回0(假),否者返回真
    while(cin >> food){
        count = count + 1;
        cout << "你最喜欢的第" << count << "种食物是" << food << endl;
        
    }
    
    cout << "你最喜欢吃的食物有" << count << "种" << endl;
    
    return 0;
}

输入:苹果 香蕉 草莓 面包 米饭 按下ctrl + z回车

结果:

你最喜欢的第1种食物是苹果
你最喜欢的第2种食物是香蕉
你最喜欢的第3种食物是草莓
你最喜欢的第4种食物是面包
你最喜欢的第5种食物是米饭
你喜欢吃的食物有5
  • 上面的例子介绍了输入多个字符串的情况
  • 思考:如果要输入的字符串里面包含空格怎么办呢?

string变量输入一行

#include<iostream>
#include<string>

using namespace std;

int main(){
	
    string food;//食物
    cout << "你最喜欢的食物有哪些呀?" << endl;
    //读取一行
    //从标准输入设备(cin)读取一行,读取一行字符串,保存到food中
    //读一行,直到遇到回车符,不包括回车符
    //如果用户直接输入回车,就没有任何数据输入。
    getline(cin, food);
    
    //判断语句,括号中的结果为true就执行,否者执行else中的语句。
    //food.empty()判断字符串是否为空字符串,如果是就返回true
    if(food.empty() == true){
		cout << "你啥都没输入呢" << endl;
    }else{
		cout << "太巧了,我也喜欢吃" << food << endl;
    }
    
    //string常用函数
    //计算字符串的长度 length(); 和 size()
    cout << "food的长度为:" << food.length() << endl;
    cout << "food的长度为:" << food.size() << endl;
    
    return 0;
}

和上一节输入相同的字符串: 苹果 香蕉 草莓 面包 米饭
输出结果:

你最喜欢的食物有哪些呀?
苹果 香蕉 草莓 面包 米饭
太巧了,我也喜欢吃苹果 香蕉 草莓 面包 米饭
food的长度为:24
food的长度为:24
  • 分析:使用getline(cin, food)苹果 香蕉 草莓 面包 米饭读入food中。
    最后由food.length()或者food.size()计算出字符串长度。
    长度分析:(此处)一个汉字两个字节,一个空格符一个字节,一共10个汉字,4个空格

string字符串的比较

  • 比较规则:和C语言相同。
    从第一个字符开始,对应字符逐个比较,直到遇到不相等的字符为止。

  • 比较运算符:

    >  >=(无空格)  <   <=(无空格)  ==(无空格))

  • 比较的结果: 逻辑真(非0), 逻辑假(0)
    例如:
    “123” < “1230” 真
    “19” > “123456789” 真
    “2” > “1999” 真
    “123” == “123” 真
    “123” == “1230” 假

  • 分析:(容易搞错)
    第一个"123" < "1230": 第一个字符相同,第二个字符相同,第三个字符相同都跳过,第四个字符前面字符串为 ‘\0’ ,后面字符串为0值不相等(ASCII值不等)进行比较,0的ASCII值大于 ‘\0’ 的ASCII值,所以返回真。
    第二个“19” > “123456789”: 第一个字符相同,第二个字符不同进行比较, '9' > '2' 为真,返回真。
    第三个"2" > "1999" :第一个字符不同,进行比较, '2' > '1'返回真。
    第四个"123" == "123":每个字符都相同,返回真。
    第五个“123” == “1230”: 与第一个类似,0的ASCII不等于'\0'的ASCII值。返回假。

string字符串的加法

  • 规则:把+号左侧的字符串和+号右边的字符串直接拼接成新的字符串。(C语言中字符串不支持该方式)
  • 注意: 与数学中的”加法“不同。
    例如:“12” + ”12“ = ”24“
    ”12“ + ”12“ = ”1212“

C语言字符串简介

  • 在C语言中, 字符串是以"字符数组"(下节介绍)储存的。不需要加头文件string。注:使用scanf()printf()需要包含头文件stdio.h
    例如:char name[32];
    scanf("%s", name);//C语言的格式化输入语句
    printf("%s", name);//C语言的格式化输出语句
#include<stdio.h>
#include<iostream>

int main(){
	char name[32];
    
    printf("请输入姓名:\n");
    scanf("%s", name);
    
    //也可以用C++的标准输入
    std::cout << "请输入姓名" << endl;
    std::cin >> name;
}

本节介绍了字符串的概念和用法,很重要。下节我们介绍数组(关键)。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值