字符串的题目一直做不好,一些知识点掌握不熟练。在1019的坑里绕了一天,终于AC!
整理一下关于字符串的点~~(持续更新)
一、输入问题
1,最简单的一种:事先输入n,规定了用例组数;输入字符串中间没有空格或者空格是可预知的。这时对字符串通常用字符数组char [],操作比string类型方便:
int n;
cin >> n;
while(n--){
char str[N] = " "; //最好初始化,否则循环时可能对以后的数据有影响,不知道为什么
cin >> str;
}
比如九度1013,开门人关门人,输入为
EE301218 08:05:35 20:56:352,输入多组字符串,输入字符串中间有空格,直到遇到规定结尾。这时不能用字符数组char [],只能用string 和getline:
string str;
while(getline(cin, str)){
if(str == "规定结尾") break;
}
比如1019,简单计算器,输入为
1 + 2 4 + 2 * 5 - 7 / 11 0
3,其他,不是正常情况,只列出代码和运行结果:
int main(){
char str[N];
while(scanf(" %s", str) != EOF){
cout << str;
}
return 0;
}
结果:
输入:12 34 hhh aaa, b
输出:1234hhhaaa,b
二、字符数组char []常用方法
1,长度 strlen(str)
三、字符串string常用方法
1,长度 str.size()或str.length()
四、vector<type>常用方法
1,添加到末尾str.push_back()
2,弹出末尾元素str.pop_back()
3,清空str.clear()
五、字符和数字转化(整型或浮点型)
字符转数字
1,单个数字:str[i] - '0'
2,字符串(参数为const char *,不能是string哦):atoi(str)(头文件<stdlib.h>)
数字转字符
3,snprintf(str, "%d", 123)
六、切分,以空格或其他字符(可以多个)切分字符串,并加入vector<string>
#include <cstdio>
#include <cstring>
#include <vector>
#include <iostream>
#define N 100
using namespace std;
int main(){
string str;
char str0[N];
vector<string> ans;
getline(cin, str);
for(int i = 0; i < str.size(); i++){
str0[i] = str[i];
}
char *sep = " "; //如果以多个符号切分,直接加入即可,如",+"
char *p;
p = strtok(str0, sep); //char * strtok(char *s, const char *delim)
while(p){
ans.push_back(p);
p = strtok(NULL, sep);//strtok固定用法,第一次p = strtok(str0, sep);第二次 p = strtok(NULL, sep);
}
for(int i = 0; i < ans.size(); i++){
cout << "ans[" << i << "] = " << ans[i] << endl;
}
return 0;
}
结果:
输入:abc de 123
输出:
ans[0] = abc
ans[1] = de
ans[2] = 123
最后,贴一下1019的题目和自己的做法,已AC,欢迎批评指正~
-
题目描述:
-
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
-
输入:
-
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
-
输出:
-
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
-
样例输入:
-
1 + 2 4 + 2 * 5 - 7 / 11 0
-
样例输出:
-
3.00 13.36
#include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>
#include <stdlib.h>
#define N 201
using namespace std;
main(){
string str;
while(getline(cin, str)){
if(str == "0") break;
char str0[N] = " ";
for(int i = 0; i < str.size(); i++){ //将string转移到char[]中
str0[i] = str[i];
}
vector<double> num; //num中存放数字
vector<char> sf; //sf中存放+、-号, * 和 / 在遍历时就直接计算出来
double ans;
double a, b;
char *sep = " "; //以空格切分字符串,同时计算乘除
char *p;
p = strtok(str0, sep);
while(p){
if(p[0] == '+' || p[0] == '-'){
sf.push_back(p[0]);
}else if(strcmp(p, "*") == 0){
a = num[num.size() - 1];
num.pop_back();
p = strtok(NULL, sep);
num.push_back(a * atof(p));
}else if(strcmp(p, "/") == 0){
a = num[num.size() - 1];
num.pop_back();
p = strtok(NULL, sep);
num.push_back(a / atof(p));
}else{
num.push_back(atof(p));
}
p = strtok(NULL, sep);
}
ans = num[0];
int k = 0;
for(int i = 1; i < num.size(); i++){ //再遍历num和sf,此时只要顺序计算加减法
if(sf[k] == '+'){
ans = ans + num[i];
}else if(sf[k] == '-'){
ans = ans - num[i];
}
k++;
}
printf("%.2f\n", ans);
}
return 0;
}