首页 > 代码库 > 《好学的C++ 第2版》 第5章 字符串--分析文本

《好学的C++ 第2版》 第5章 字符串--分析文本

文本字符串存储:每个字符加上一个‘\0‘的ascii码。所以一个文本字符串也就是一连串字节,每个字节是0~255的一个数值。键盘输入或屏幕输出时,会发生数值跟字符之间的转换。(国际标准unicode编码使用了一个以上的字节 来表示每个字符。)

由于源代码保存在文本文件里,而文本字符是以数值形式存储的。因此计算机来处理源代码时,处理的其实就是这些连串的数值,按照另一套精确的规则进行另一种形式的数值运算、数据求值和决策判断。(!!!最开始的第一版编译器只能用机器码来编写!!!而老编译器又可以用来编写新编译器,就这样波浪发展,复杂的编译器当然不用机器码编写啦!)

字符串实际是基类型为char(一字节宽的整形)的数组。

char str[20] = "how long?";  //未初始化的成员,是否全局情况就是0,局部情况就是垃圾?

字符串以‘\0‘(即数值0)为结尾。

char s[] = "const"; //未指定长度,会被分配8个字节空间(包括容纳‘\0‘),s是常量 //it:指定长度不足会截断?

char* s = "variable"; //s是变量,可以被重新赋值指向别处。it:所以可以分声明const char* s;这样s就不可变了。

 

字符串处理函数:

strcpy(s1,s2)         //s2复制到s1

strcat(s1,s2)         //s2追加到s1

strncpy(s1,s2,n)    //最多复制n个,不包括‘\0‘   //s2是常量字符串并且里头有‘\0‘,会怎么样?

strncat(s1,s2,n)     //最多追加n个,不包括‘\0‘。追加起点是s1中第一个‘\0‘所在位置

strlen(s)               //s的长度,不包括‘\0‘

strtok(src_str,delims)  // 用字符delims分割src_str,返回第一个子串的指针

strtok(NULL, delims)   //返回已知源串(strtok上次调用所指定的src_str)里的下一个子串的指针。没有子串可返回就将返回NULL

 

c++不会为了能保存整个字符串做任何事,这得码农保证。

char s[80]; //指定了长度但没初始化,c++还是为它保留了80个字节

当代码中出现常量字符串,c++会为之分配空间并返回其地址,即字符串被求值为一个地址。

 

#include <iostream>

#include <cstring>   //strcpy等函数在这里头

#define STR_LEN = 100;

using namespace std;

char* str[STR_LEN];

cin.getline(str, STR_LEN-1); //读入一行(读到‘\n‘即结束),最多读入STR_LEN-1个字符。(it)应该不会自动补上‘\0‘

转义字符‘\b‘是退格

输入流操作符(>>)会进行自动类型转换

cin.getline表明getline是cin这个对象的一个成员函数。对象是其成员函数的作用对象。

cin>>val;  //获取第一个空白符(空格 制表符 换行符)之前的数据,(it)尝试转化为var类型数据赋给var。空白符之后的数据还留在输入流里等待下一个输入操作把它取走。如果直接输入空白符,cin会一直等待输入。较好的方法是设置默认值并提示输入者。

cin.getline之后再用cin>>经常会出问题,原因是二者对待换行符的做法不同。因此在同一个程序里最好只用一种。

#include <cstdlib>  //有atof atoi等函数

#include <cctype>  //有toupper tolower等函数

C字符串: c及c++里以‘\0‘为结束标志的字符串(char*类型)

类似Basic,C++较新版本里提供了string类型(其实是STL提供的一个类,只有很老的C++版本才不支持STL),从而不用再考虑字符串长度这种繁琐易错的东西。#include <string>可激活此支持。(注意激活C字符串的是<cstring>,strcpy等老函数需要它) 类似于cin和cout,可以选择using namespace std,否则就要std::string这样使用这个类。 it:<string>属于c++标准库而不属于c标准库。另外,c的标准库(例如<ctype.h>)在c++中另有实现(例如<cctype>)

string a, b, c;                //声明

string a("so"),b("easy"); //初始化

a = "so"; b = "easy";  //初始化

string a = "so";          //声明加初始化

a可以重新复制而不用担心容纳不了:

a = "fking beauty is nature.";

可以进行比较:

int ret = (a == b);

 

《好学的C++ 第2版》 第5章 字符串--分析文本