C ++第八週間コースのメモ:文字列

注:シラバスを参照https://www.cnblogs.com/inchbyinch/p/12398921.html

1文字列クラス

文字列は、主に文字列処理のために、C ++標準ライブラリの重要な部分です。ストリングのためのアルゴリズムのC ++ライブラリも良いサポートを有し、そして文字列と、言語、C文字列との間の良好な界面を有している文字列クラス自体は、便利な機能の数を定義します。ここではいくつかの一般的なアクション文字列オブジェクトのリストです。

  • メインの初期化動作、アクセス、割り当て、連結、比較、交換、追加または削除、検索、変更、文字列C、流れとの相互作用との相互作用。
  • CPPの公式サイトより完全な例:http://www.cplusplus.com/reference/string/basic_string/
  • 文字列クラスは、テンプレートクラスである:typedefでのbasic_string <文字>文字列
  • ヘッダファイル<string>を含めるように文字列クラスを使用します

1.1文字列オブジェクトの初期化

//默认初始化
string s; //s是一个空串
//使用字符串字面值初始化
string s1="hello world";  //拷贝初始化
string s2("hello world");  //直接初始化
//使用其他字符串初始化
string s2=s1; //拷贝初始化,s1是string类对象
string s2(s1); //直接初始化,s1是string类对象
//使用单个字符初始化
string s(10, 'a'); //直接初始化,s的内容是aaaaaaaaaa

//下面是错误的初始化方法
string error1 = 'c'; // 错
string error2('u'); // 错
string error3 = 22; // 错
string error4(8); // 错
//可以将字符赋值给string对象
string s; s = 'n'; //可以

1.2アクセス

//获取长度
s.length();
s.size();

//访问元素
s[i];  //不会做范围检查
s.at[i]; //会做范围检查

//获取string迭代器,通过迭代器访问
for(std::string::iterator it=str.begin(); it!=str.end(); ++it)
    std::cout << *it;
std::cout << '\n';

1.3割り当て、接続、比較、為替

//赋值方式1:=
//赋值方式2:assign函数,将string对象,或char*字符串(或部分),或指定字符赋给s2
string base("The quick brown fox jumps over a lazy dog.");
string s1, s2;
s1 = "hello";
s1 = 'a';
s1 = base;
s2.assign(base);
s2.assign(base, 1, 5); //从base中下标为1的字符开始复制5个字符给s2
s2.assign(base.begin()+16, base.end()-12);
s2.assign("pangrams are cool");  
s2.assign("pangrams are cool", 7);  // "pangram"
s2.assign(10, '*');

//string连接方式1:+
//string连接方式2:append
string s1("good "), s2("morning! ");
s1 += s2;
s1.append(s2);
s2.append(s1, 3, s1.size()); //从s1下标3开始,复制s1.size()个字符
//如果字符串内没有足够字符,则复制到字符串最后一个字符

//比较方式1: >,  >=,  <,  <=,  ==,  != 返回值为bool类型
//比较方式2:成员函数compare,返回值int:若主体s1大则为正,若小则为负,若等于则为0
string s1("hello"),s2("hello"),s3("hell");
cout << (s1 > s3) << endl; //1
cout << s1.compare(s2) << endl; //0
cout << s1.compare(s3) << endl; //1
cout << s3.compare(s1) << endl; //-1

//swap函数交换string
string s1("hello world"), s2("really");
s1.swap(s2); //成员函数
swap(s1, s2); //全局函数

変更の検索に1.4の追加および削除

//成员函数substr获取子串
string s1("hello world"), s2;
s2 = s1.substr(4,5);  //下标4开始5个字符

//查找string对象中子串,find()或rfind()
//下例中find()从前向后查找"lo"第一次出现的地方,若找到,返回"lo"开始的位置,
//即'l'所在的位置下标。否则返回string::npos(string中定义的静态常量)
string s1("hello world");
s1.find("lo");  //3
s1.find("ll",3); //4294967295  从下标3处开始查找
s1.rfind("ll"); //2  rfind()从后向前查找,用法和find()相同

//查找string对象中字符
//find_first_of(),find_last_of(),find_first_not_of(),find_last_not_of()
//下例中find_first_of从前向后查找"abcde"中任何一个字符第一次出现的地方
//而find_first_not_of是从前向后查找不在"abcde"中的字母第一次出现的地方
//如果找到则返回找到字母的位置,如果找不到,返回string::npos
string s1("hello world");
s1.find_first_of("abcde");  //1
s1.find_last_of("abcde");  //10
s1.find_first_not_of("abcde"); //0
s1.find_last_not_of("abcde");  //9

//删除erase(), 插入insert(), 替换replace()
s1.erase(5,s1.length()); //自下标5开始删除,可通过下标和迭代器均可定位
s1.insert(5,s2); // 将s2插入s1下标5的位置
s1.insert(2,s2,5,3); //将s2中下标5开始的3个字符插入s1下标2的位置
s1.replace(2,3,"haha"); //将s1中下标2开始的3个字符换成"haha"
s1.replace(2,3,"haha",1,2); //将s1中下标2开始的3个字符换成"haha"中下标1开始的2个字符

Cスタイルの文字列と1.5の相互作用

  • シームレスC文字列の文字列オブジェクトに、3つの方法があります。
  • COUTはprintfのせずに、直接文字列C((CONST)のchar *名または配列型)を印刷することができます。
  • 文字列オブジェクト缶()c_str介してC列にメンバ関数、CONSTチャー*戻り型。
//C风格字符串转为string
const char *s = "Hello world!";
string str1(s);
string str2 = s;
string str3("haha");
str3 = s;

//s1.c_str()返回s1内部的const char* 类型字符串,且该字符串以‘\0’结尾。
string s1("hello world");
const char* p = s1.c_str();
cout << p << endl;  

//copy(),将string复制为char* 字符串,返回复制的字符个数
char buffer[20];
string s1("Test string...");
length = s1.copy(buffer,6,5); //复制长度为6,从下标5开始(与前不同)
buffer[length]='\0';

1.6流れと相互作用

//string支持流读取运算符
string stringObject;
cin >> stringObject;

//string支持全局getline函数
string s;
getline(cin, s);
//getline和stringstream搭配用于split
string a, b, c, d; 
string lines="adfa;asdfasd;fasdf;ccc";  
stringstream line(lines);  //可以直接初始化
getline(line, a, 'f'); 
getline(line, b, ';'); 
getline(line, c, ';'); 
getline(line, d);   //默认以换行符作为delim

2にstringstream

  • <sstream提供>ライブラリを定義三種類:istringstream、ostringstreamとにstringstreamは、入力、出力、及び入力と出力操作文字列ストリームのために使用されます。
  • とてもバッファオーバーフローの危険性を回避するために、内部的に文字列オブジェクトの代わりに、文字の配列を使用しています。また、それは自動的にいないため、互換性のないフォーマットやエラーのタイプを推測することができます。
  • stringstreamアクション1:一般的に、データ変換のために使用。変換Cライブラリを比較すると、それはより安全な自動かつ直接的です。
  • 2にstringstream効果:のgetlineと組み合わせ、文字列は、セグメント化のために使用することができます。
  • 参考 1、参考2

注意:

  • stringstreamは容易に変換クリア()への注意を喚起するために、データ変換のために使用することができます。
  • 明確な方法の内容は、(「」)の.str使用する必要が空に、SSに(などのエラー、など)の状態をクリアされている方法(実際に交換変換SSを継続する必要がある場合は、まだ明確な空の状態を呼び出す必要があります。);
  • oss.str()抽出した文字列を使用して、文字列変数を変換する必要のそれぞれにostringstream時間を利用することができる、文字列を構築istringstreamを使用して変換され、それぞれの可変時にオンされる(にstringstream代わりにお勧めします。)。
//示例1:利用stringstream,基本数据类型与string互转
int main(){
    int a1 = 56, a2 = 0, a3=0;
    double b1 = 65.123, b2 = 0.0, b3=0.0;
    stringstream ss;  //头文件是sstream

    ss << a1 << " " << b1;  //将基本类型转为string
    cout << "1. " << ss.str() << endl; //1. 56 65.123
    ss >> a2 >> b2; //注:ss中数据应以空格作为分隔
    cout << "2. " << a2 << "---" << b2 << endl; //2. 56---65.123

    ss.clear(); //每一次转换之后都必须调用clear()成员函数清空状态
    //ss.str(""); //可以清空原数据
    ss << b1 << " " << a1;
    cout << "3. " << ss.str() << endl; //3. 56 65.12365.123 56
    ss >> b3 >> a3;
    cout << "4. " << ss.str() << endl; //4. 56 65.12365.123 56
    cout << "5. " << a3 << "---" << b3 << endl; //5. 56---65.123
    return 0;
}


//示例2:利用ostringstream和istringstream进行string与基本类型的互转
int main(){
    int a=1, b=3, a1, b1;
    double c=2.4, d=3.4, c1, d1;
    //一次性读入需要转换成string的各个变量,并保存至string
    ostringstream oss;
    oss << a << " " << b << " " << c << " " << d;
    cout << oss.str() << endl;
    string s = oss.str();
    //利用待转换的string来构造istringstream,然后一次性转成各个变量
    istringstream iss(s);
    iss >> a1 >> b1 >> c1 >> d1;
    cout << iss.str() << endl;
    cout << a1 << " " << b1 << " " << c1 << " " << d1 << endl;
    return 0;
}

トラップ:

  • ostringstream.strは())my_string = ostringstream.str()を保存するための時間に値を返します、使用できませんostringstream.str(必要があり、通常の書き込みによると、一時オブジェクトの文字列を返します。c_str()。
  • 利用可能なコンテンツを保存する必要があり、自分のスペース場合c_str()は、constの一時的な* char型のポインタを返します。
  • 参考 1、参考2

3文字列関連の知識

3.1いくつかの理解

三つの区別文字列のヘッダファイル、CStringの、string.hの

  • string.hの何かC標準ライブラリ、そこにstrcpy、memsetの他の機能。
  • 互換C C ++のために、.hファイルは、.hファイルのヘッダに対応する、Cを添加して、シェルを設定します。
  • 平均して、標準ライブラリでこのようなstring.hのような「.hの」拡張ライブラリ、とC ++ライブラリの古いバージョンは、(のCStringなど)「の.h」の拡張ヘッダにすることなく、新しい標準を持っていますいくつかの改良を除き、後者の違いに対応するだけでなく、後者の点は、このようなにstrlen関数を呼び出すように、「STD」の名前空間にすべてのものである、あなたは書き込みのstdに必要な:: strlenを(yourstr)の仕事。
  • あなたがC ++を使用している場合は、C string.hのしてくださいを使用している場合は、してください使用は、CStringの。
  • C ++のヘッダファイルが、使用されている文字列を定義したのstd ::文字列ファイル、文字列クラスのヘッダファイルであるカテゴリのSTLに属し

関数を使用するのCString / string.hのヘッダファイル

  • strlen、strcpyの、strcatは、strcmpの
  • memcpy、memsetと、はstrtok

STLのソート機能の並べ替えメカニズム:

  • それが本当であれば、CMP関数として比較パラメータは、二つの引数で、その後の要件を満たします。
  • したがって、比較関数で、戻りA場合<ASCと比較してB、もし戻りA> B、下降しました。

メソッドの文字列セグメンテーション3.2

  • 方法1:ストリングフローを使用して、(その別々のスペースを必要とします)
  • 方法2:文字列getline関数とグローバルフローを使用して、(例1.6を参照されたいです)
  • 方法3:使用のCStringのstd ::はstrtok()関数。
#include <iostream>
#include <cstring>
#include <string>
using namespace std;

int main(){
    //目的是将一个string对象按照分隔符分割成几个子串对象
    //通过C风格的strtok函数进行分割 
    //char * strtok(char* str, const char* delimiters);
    //由于strtok函数需要传入C风格的字符串,且会破坏字符串结构,故复制原string对象内容
    string s = "hello,  big  - world.";
    string str1, str2, str3;
    char a[100] = {0};
    std::strcpy(a, s.c_str()); //c_str()函数返回const char*类型
    cout << a << endl; //输出hello,  big  - world.

    str1 = std::strtok(a, " ,-.");
    str2 = std::strtok(NULL, " ,-.");
    str3 = std::strtok(NULL, " ,-.");

    cout << a << endl; //输出hello
    cout << str1 << "-" << str2 << "-" << str3; //输出hello-big-world
    return 0;
}

デジタル文字列解析方法に3.3

  • 方法1:()関数の位置を見つけ、ストリングフローを使用します。
  • 方法2:正規表現、機能、またはCのscanf関数を使用します。
  • 方法3:使用cstdlibのはstd ::にstrtod()関数。
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;

class Complex{
private:
    double r, i;
public:
    Complex(){};
    Complex(const char* p){
        char a[20];
        char* pEnd;
        std::strcpy(a, p);
        r = std::strtod(a, &pEnd);
        i = std::strtod(pEnd+1, NULL);
    }
    void Print() {
        cout << r << "+" << i << "i" << endl;
    }
};

int main(){
    Complex a;
    a = "3+4i"; a.Print();
    a = "5+6i"; a.Print();
    return 0;
}

おすすめ

転載: www.cnblogs.com/inchbyinch/p/12398540.html