使用向量

时间:2018-04-24 23:15:36

标签: c++ string vector char reverse

我试图编写一个从文件中读取文本的程序(只有字符串)并将其反转。以下代码可以做到这一点,但它没有考虑单词之间的空格:

#include<iostream>
#include<vector>
#include<fstream>


using namespace std; 

int main(){

    ifstream file("file.txt");
    char i;
    int x;
    vector<char> vec;

    if(file.fail()){
        cerr<<"error"<<endl;
        exit(1);
    }



    while(file>>i){
        vec.push_back(i);
    }

    x=vec.size(); 

    reverse(vec.begin(), vec.end());

    for(int y=0; y<x; y++){
        cout<<vec[y];
    }


    return 0;
}

如果文件上的文字是&#34; dlroW olleH&#34;,该程序将打印出&#34; HelloWorld&#34;。我能做些什么来打印&#34; Hello World&#34; (两个词之间的空格)?

2 个答案:

答案 0 :(得分:2)

reverse函数运行正常,问题出在这里:

while(file>>i){

std::operator>>会跳过空格和新行,您需要使用std::istream::getline来避免这种情况或尝试使用std::noskipws操纵符。

用法:

#include <iostream>     // std::cout, std::skipws, std::noskipws
#include <sstream>      // std::istringstream

int main () {
  char a, b, c;

  std::istringstream iss ("  123");
  iss >> std::skipws >> a >> b >> c;
  std::cout << a << b << c << '\n';

  iss.seekg(0);
  iss >> std::noskipws >> a >> b >> c;
  std::cout << a << b << c << '\n';
  return 0;
}

输出:

123
  1

答案 1 :(得分:2)

当用户4581301指出时,>>将自动跳过任何空格。您可以使用std::noskipws流操作符并将file>>i更改为file>>std::noskipws>>i来禁用此功能。一个更好的解决方案就是简单地使用std::getline将整个字符串读入std::string,将其反转,然后将其打印出来,而不是单独处理字符。

#include <string>
#include <fstream>
#include <iostream>
#include <algorithm>
int main()
{
    std::ifstream file("input.txt");
    //insert error checking stuff here
    std::string line;
    std::getline(file, line);
    //insert error checking stuff here
    std::reverse(line.begin(), line.end());
    std::cout << line << '\n';
}

只是关于代码的注释,您应该仅在使用它们时声明变量。例如,您的变量x仅在程序结束时使用,但它在顶部一直声明。 using namespace std也可以是considered bad practice