C和C++中字符串说明与记录

目的

对于C和C++字符及字符串我以前接触的少,很多概念方法等并不是很明晰,在此做个笔记梳理下相关内容。

C语言

字符基本说明

对于计算机来说本身并不存在字符(char)这种东西,计算机存储的只是一个个的值,但是单纯的值对于我们来说并不适合表达阅读信息,所以人为的将值和字母符号等联系起来,常见的比如ASCII码。ASCII码将0~127的值对应为英语环境下的字母符号等,见下图:
在这里插入图片描述http://www.asciima.com/

字符基本声明与使用可以看下图,注意单个字符用单引号''包围:
在这里插入图片描述
根据上面说明和演示可以知道单个的char其实就是将值换了个形式表达,所以单个的char之间是可以进行大小比较以及加减乘除等各类运算的,其本质还是数值间运算。

字符串声明与操作

在C语言中的字符串是以结束符\0为结尾的字符数组,可以用下面方式声明:

char s1[6] = {'a','b','c','d','e','\0'};
char s2[6] = "ABCDE"; //同上面的方法,该方式声明时会在结尾自动补上'\0',所以长度也为6
char *s3 = "12345"; //理论上同char s3[6] = "12345";但实际使用时根据环境不同“12345”有可能会是无法修改的只读数据,所以常见的还会在前面加上const显性表示只读数据用
                    //同样的字符串以'\0'结尾,所以s3长度也为6; 
char s4[6] = {'1', '2', '\0', '4', '5', '\0'}; //这里中间出现了'\0',所以当字符串使用时表示"12"
char s5[] = {'a','b','c','d','e','\0'}; //同s1
char s6[] = "ABCDE"; //同s2

字符串基本使用见下图:
在这里插入图片描述
注意:字符串是一种字符数组,但字符数组并不一定是字符串,关键在于有没有’\0’。

字符串常用函数说明

字符串相关的函数非常多,这里只列举些常用的,注意有些函数需要包含头文件string.hctype.hstdlib.h

属性

  • size_t strlen(const char *str)
    返回字符串长度(不包含结束符\0

复制

  • char *strcpy(char *dest, const char *src)
    把 src 所指向的字符串复制到 dest;
  • char *strncpy(char *dest, const char *src, size_t n)
    把 src 所指向的字符串复制到 dest,最多复制 n 个字符;

合并

  • char *strcat(char *dest, const char *src)
    dest去掉结束符,并在后面加上src,该函数会自动补\0
  • char *strncat(char *dest, const char *src, size_t n)
    dest去掉结束符,并在后面加上src的最多n个字符,该函数会自动补\0

替换

  • char *strupr(char *s)
    将字符串s中的字符变为大写;
  • char *strlwr(char *s)
    将字符串s中的字符变为小写;
  • int tolower ( int c )
    将大写字母转换为小写;
  • int toupper ( int c )
    将小写字母转换为大写;

查询

  • char *strchr(const char *str, int c)
    返回str指向的字符串中第一次出现字符c的位置,如果没有则返回null(\0);
  • char *strrchr(const char *str, int c)
    返回str指向的字符串中最后一次出现字符c的位置,如果没有则返回null(\0);
  • char *strstr(const char *haystack, const char *needle)
    在字符串 haystack 中查找第一次出现字符串 needle(不包含空结束字符)的位置,如果没有则返回null(\0);

比较

  • int strcmp(const char *str1, const char *str2)
    把 str1 所指向的字符串和 str2 所指向的字符串进行比较,str1<str2,返回负数;str1=str2,返回 0;str1>str2,返回正数
  • int strncmp(const char *str1, const char *str2, size_t n)
    从头开始比较 str1 和 str2 最多 n 个字符,返回结果同上;

类型检查

  • int isalpha ( int c )
    判断字符是否为字母,返回非0为真,返回0为假;
  • int isdigit ( int c )
    判断字符是否为十进制数字;
  • int isxdigit ( int c )
    判断字符是否为十六进制数字;
  • int islower ( int c )
    判断字符是否为小写字母;
  • int isupper ( int c )
    判断字符是否为大写字母;

类型转换

  • char *itoa( int value, char *string,int radix)
    将整型转换为字符串,参数分别为欲转换数据,目标地址,进制(2、8、10、16等);
  • char *ltoa( int value, char *string,int radix)
    将长整型转换为字符串,其他同上;
  • int atoi(const char *str)
    把参数 str 所指向的字符串转换为一个整型,如果无法转换则返回0;
  • long int atol(const char *str)
    把参数 str 所指向的字符串转换为一个长整型,如果无法转换则返回0;

C/C++

字符串基本说明

C++向下兼容C语言,所以可以按C语言来使用操作字符串(C语言中string.h库在C++里推荐使用cstring代替),另外C++ namespace std中有string类,可以使用string对象。string对象的加入使操作字符串变得方便许多,可以直接进行赋值与加法操作或是比较操作,使用示例见下面代码:

#include <iostream>
#include <string> //引入头文件

using namespace std;

int main()
{
    string str1;  //声明了一个空字符串
    str1 = "12345"; //赋值
    cout << "str1: " << str1 << endl; //打印输出

    string str2("abcde"); //声明一个字符串
    cout << "str2: " << str2 << endl; //打印输出

    string str3("abcde", 3); //声明一个从输入字符串中从头开始取3个字符的字符串
    cout << "str3: " << str3 << endl; //打印输出

    string str4(str1, 1, 2); //声明一个从输入字符串中下标1开始两个字符的字符串
    cout << "str4: " << str4 << endl; //打印输出

    string str5(5, 'E'); //声明一个由5个E组成的字符串
    cout << "str5: " << str5 << endl; //打印输出

    cout << "str1 + str2: " << str1 + str2 << endl; //string加法

    if(str1 == "12345") //比较
    {
        cout << "str1 == \"12345\": " << "true" << endl;
    }

    if(str1 > str5) //比较
    {
        cout << "str1 > str5: " << "true" << endl;
    }
    else
    {
        cout << "str1 > str5: " << "false" << endl;
    }

    //字符串的比较是从左到右依次进行,直到得出结果

    return 0;
}

上面代码运行结果如下:
在这里插入图片描述

C++ string和C语言字符串转换

C语言字符串转为C++ string:

const char *ch = "hello"; //或者 char ch[] = "hello";
string str1(ch); //转换方法1
string str2 = ch; //转换方法2

C++ string转为C语言字符串:

string str("hello");
const char *ch = str.c_str(); //string转c语言字符串

C++ string常用方法说明

字符串相关的方法非常多,这里只列举些常用的(很多方法都有非常多的重载,这里不一一列出),注意有些方法需要用到string库。

属性

  • int size()const
    返回当前字符串长度,同int length()const
  • bool empty()const
    返回当前字符串时候为空;
  • void resize(int len,char c)
    把字符串重置为len长度,长度边长的用字符c补充(选填);

类型转换

  • int stoi (const string& str, size_t* idx = 0, int base = 10)
    将数值形式的字符串转换为整型,输入参数分别为字符串、起始位置下标、进制(2、8、10、16等);
  • long stol (const string& str, size_t* idx = 0, int base = 10)
    将数值形式的字符串转换为长整型;
  • to_string()
    将各种数值类型转换为string;

修改

  • append()
    在字符串后面增加字符或字符串;
  • insert()
    向字符串插入字符或字符串;
  • erase()
    从字符串中删除某些或某部分;
  • replace()
    替换字符串中某些或某部分;

查询

  • find()
    正向查询字符串中的内容出现位置;
  • rfind()
    反向查询字符串中的内容出现位置;

比较

  • compare()
    字符串间比较;

总结

字符串在上位机开发中是经常会用到的,了解相关内容还是蛮有必要的。

更多内容参考如下:
http://c.biancheng.net/view/1832.html
http://c.biancheng.net/view/1834.html
http://www.cplusplus.com/reference/cstring/
http://c.biancheng.net/view/2236.html
http://c.biancheng.net/view/400.html
http://www.cplusplus.com/reference/string/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naisu Xu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值