一些函数的使用
getline()函数:
1、作为输入输出流函数:
虽然可以使用 cin 和 >> 运算符来输入字符串,但它可能会导致一些需要注意的问题。
当 cin 读取数据时,它会忽略(空格、制表符或换行符)。一旦它接触到第一个非空格字符即开始阅读,当它读取到下一个空白字符时,它将停止读取。
而getline可以读取一行数据,包括末尾的空行和中间的空白字符
用法:如getline(cin, relative);将读入的放入string relative里面;
2、作为普通函数:
istream& getline (istream& is, string& str, char delim);
将is里面的字符流,存储到string str里面,直到遇到delim这个字符(或者遇到换行符\n)停止;然后下一个输入会从上一个停止的后一个开始继续读入存储。
例如:getline(ss, dir, ‘/’);将ss里面的字符流读入dir里面,遇到’ / ‘停止,然后从上一个’/‘停止的下一个字符开始读入。意思就是以’/‘为分界点,一段一段读入’/'里面的字符,直到遇到换行符结束。
stringstream s(string):将string类型的字符串,变成一个字符流类型
题目
分析
这个题目如果会使用getline函数,以’/'为分界符读入字符串的话,还是比较好做的;
1、首先将当前路径的文件名存放在一个vector< string> stk 里面;
2、如果输入的是绝对路径,则不需要当前路径,stk清空即可
3、如果遇到 . 那么只需要忽略这个点;如果遇到 . . 那么就从stk里面删去最新加入的文件夹。
4、根据stk里面的文件,就可以直接输出标准的路径了。
代码
#include<stdio.h>
#include<iostream>
#include<string>
#include<vector>
#include<sstream>
using namespace std;
void output(const vector<string> &stk) {
if(stk.empty()) printf("/");
else{
for(int i=0; i<stk.size(); i++) {
cout<<"/"<<stk[i];
}
}
printf("\n");
}
void jiexi(vector<string> &stk, string path) {
stringstream ss(path);
string dir;
bool first = true;
while(getline(ss, dir, '/')) {
if(dir.empty()) {//进来的是绝对路径而不是相对路径
if (first) stk = vector<string>();//如果进来的是绝对路径,清空stk
}
else if(dir == "..") {//上一级目录
if(!stk.empty()) stk.pop_back();//根的上一级是它本身
}
else if(dir == ".") {}//本身
else {
stk.push_back(dir);
}
first = false;
}
}
int main() {
int N;
vector<string> stk, newStk;
scanf("%d",&N);//有N个要解析的
string current, relative;
cin>>current;//当前路径
formalize(stk, current);
cin.ignore();
while(N--) {
getline(cin, relative);//读取一行
newStk = stk;//stk里面存放的一直都是当前路径
jiexi(newStk, relative);
output(newStk);
}
}