c++字符串与复杂输入处理

string字符串

分类

C风格字符串:以 '\0' 结尾的 char 数组。

c++风格 string:STL中提供的字符串类,进行了封装。

在ACM中,在不配合容器等的使用中 ,推荐使用C风格字符串,其操作更灵活。

字符串转为数字型

很多时候都会遇到将字符串作为输入转换为数值或者把数值转为字符串的情况。

c风格字符串

使用<cstdlib.h>中的函数

  • atof(char *str) 转译C风格字符串str为浮点值

  • atoi(char *str) 、atol(char *str) atoll(char *str) (C++11) 转译C风格字符串str为整数值(int、 long、long long)

上述函数取尽可能长的符合要求的字符串

c++风格字符串

  • stoi(string &s)
  • stol(string &s)
  • stof(string &s)
  • stod(string &s)

...

类似的,根据结尾可判断返回的类型:

i: 返回int型
l:返回long
f:返回float
d:返回double
ll:返回long long
ull:返回unsigned long long
ld:返回long double

格式化输入

  1. 使用<cstdio>中的函数

    • sscanf(char *buffer, char *format, ...) 以buffer为源,进行格式化输入

    • sprintf(char *buffer, char *format, ...) 格式化输出到buffer

  2. 使用<sstream>
    stringstream strin(str) str为C风格字符串或string,可以使用形如strin<<a; strin>>b;的方式来向str中输入或输出

    istringstream为只读,ostringstream为只写

基本操作

  1. 创建

    string str = "12345abcd";
    string str(c_str); //c_str为一个C风格字符串
    
  2. 常用操作

    str[n] 			//读写下标为n的字符
    str.c_str() 	//返回str对应的只读C风格字符串
    str.data() 		//返回指向str中字符串首地址的指针
    
    str.begin() str.end() str.rbegin() str.rend() //返回迭代器
        
    str.empty() 	//检查字符串是否为空
    str.size() 		//返回字符数
    str.length() 	//返回字符数
        
    str.clear //清除内容
        
    str.push_back(ch) //后附"字符"ch到结尾
        
    str += str1 //后附string str1到str的结尾
    str+str1 //返回str和str1首尾连接后产生的string
    

    string s, s1;
    s = "abcdefg";
    
    s.size();
    s.at(n);   ///读写下标为n的字符
    
    s.find(s1, 0); //从前往后, 从第0个开始查找
    s.rfind(s1);	//从后往前
    
    s.replace(0, 3, s2);   //把从0开始的3个字符替换为s2(s2可以不是3个字符)
    
    s.compare(s1);    //相等返回0,s>s1返回1,s<s1返回-1
    
    s.substr(0, 5);  //从0开始截取5个字符
    
    s.insert(0, s1);   //在0的位置后面插入s1
    
    s.erase(0, 4);  //从0开始删除4个字符
    
    

复杂输入处理

无结束标志的数据输入

通过判断是否读到EOF来决定是否停止输入

  • scanf()==EOF

  • getchar()==EOF

  • cin==false

while(scanf("%d",&a)!=EOF)
while(ch=getchar()&&ch!=EOF)
while(cin>>a)

整行输入

cin.getline(str, length);
//str是一个char数组或string,用于存储输入结果。
//length用于限制最长输入长度
posted @ 2021-07-05 21:52  aJream  阅读(33)  评论(0编辑  收藏  举报