201604-3路径解析

一些函数的使用

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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值