《好学的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);

时间: 2024-08-07 00:12:18

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

汇编语言(王爽 第三版)第十七章字符串的输入

assume cs:code data segment db 128 dup (0) data ends code segment start: mov ax,data mov ds,ax mov dh,24 mov dl,2 mov si,0 call getstr mov ax,4c00h int 21h getstr: push ax getstrs: mov ah,0 int 16h cmp al,20h jb nochar mov ah,0 call charstack mov ah,

Java 线程第三版 第四章 Thread Notification 读书笔记

一.等待与通知 public final void wait() throws InterruptedException 等待条件的发生. public final void wait(long timeout) throws InterruptedException 等待条件的发生.如果通知没有在timeout指定的时间内发生,它还是会返回. public final void wait(long timeout, int nanos) throws InterruptedException

C++ Primer Plus 第六版 第16章 string类和标准模板库

1.string实际上是模板具体化basic_string<char> 的一个typedef,有默认参数,所以省略了初始化参数 2.size_type是一个依赖于实现的整形 string将string::npos定义为字符串的最大长度 3.string类的构造函数P656 4.对于c-风格字符串,3种输入方法:cin>>   cin.getline(),cin.get 对于string   ,2种输入方法:cin>>,getline(cin,string对象) 5.st

Java 线程第三版 第六章 高级同步议题 读书笔记

多线程数据同步错误比较难检测,因为通常是与事件的特定发生顺序有关. 一.同步术语 Barrier(屏障) barrier是多个Thread的集合点:所有的Thread都应该到齐在这个barrier之后才能允许它们继续下去. Condition variable(条件变量) 实际上不是变量,而是与某个lock有关联的变量. Event variable(事件变量) 条件变量的另一个名称. Critical section(临界区) 临界区是synchronized方法或者block. Lock(锁

c++ primer plus(第6版)中文版 第九章编程练习答案

首先,说明下环境: linux:fedora14: IDE:eclipse: python:python2.7 python框架:django web服务器:apache web服务器的python模块:mod_wsgi 写在前面: 之前用的windows下面的xampp,写的php后台,现在想转向linux下面的python,跟以前一样,选择apache和eclipse作为自己的开发工具. eclipse的python配置, 参见之前的博客:http://blog.csdn.net/zy416

Java 线程第三版 第三章数据同步 读书笔记

多线程间共享数据问题 一.Synchronized关键字 atomic一词与"原子"无关,它曾经被认为是物质的最小的单元,不能再被拆解成更小的部分. 当一个方法被声明成synchronized,要执行此方法的thread必须先取得一个token,我们将它称为锁.一旦该方法取得(或者说是获得)锁,它将运行此方法然后释放掉(或者返回)此锁.不管方法时怎样返回的(包括通过异常)该锁会被释放. 二.Volatile关键字 如果变量被标示为volatile,每次使用该变量时都必须从主寄存器中读出

Java 线程第三版 第五章 极简同步技巧 读书笔记

一.能避免同步吗? 取得锁会因为以下原因导致成本很高: 取得由竞争的锁需要在虚拟机的层面上运行更多的程序代码. 要取得有竞争锁的线程总是必须等到锁被释放后. 1. 寄存器的效应 计算机有一定数量的主寄存器用来存储与程序有关的数据. 从逻辑上的观点来看,每个Thread都有自己的一组寄存器.当操作系统将某个Thread分配给CPU时,它会把该Thread特有的信息加载到CPU的寄存器中.在分配不同的Thread给CPU之前,它会将寄存器的信息存下来.所以Thread间绝不会共享保存在寄存器的数据.

Java编程思想第四版读书笔记——第十三章 字符串

Java编程思想第四版读书笔记--第十三章 字符串 字符串的操作是计算机程序设计中最常见的行为. 关键词: StringBuilder ,StringBuffer,toString(),format转换,正则表达式, 1.不可变String String对象时不可变的.每当把String对象作为方法的参数时,都会复制一份引用.(其实就是对函数中参数列表中参数的操作不会影响外面的原参数) 如下: import static net.mindview.util.Print.*; public cla

Python核心编程(第二版) 第二章习题答案 未完待续

2-2.程序输出.阅读下面的Python脚本.#!/usr/bin/env python1 + 2 * 4(a)你认为这段脚本是用来做什么的?(b)你认为这段脚本会输出什么?(c)输入以上代码,并保存为脚本,然后运行它,它所做的与你的预期一样吗?为什么一样/不一样?(d)这段代码单独执行和在交互解释器中执行有何不同?试一下,然后写出结果.(e)如何改进这个脚本,以便它能和你想象的一样工作?答:(a)这段脚本是用来计算表达式的值(b)脚本会输出9(c)保存为脚本,运行后没有输出.和自己预期不一样.