C ++字符串,标点符号,数组

时间:2014-04-02 00:33:09

标签: c++ arrays string

我需要能够仅使用c ++字符串才能更改下面的输入段落。我遇到的问题是,当我在最后用标点符号拉出某些内容时,例如"程序 - "它将它拉入我的阵列作为"程序 - "而不是"节目"和" - "分别。我需要知道如何做到这一点,以便我可以替换所有" - "用"。"。

有人如何将两者分开并将其中的每一个放在数组中?

#include <iostream>
#include <fstream>

using namespace std;


void read(string line[], string para[], int &d)
{
string temp;
int i = 0;

ifstream myfile ("paragraphwordsub.txt");
if (myfile.is_open())
{
    while ( temp != "$" )
    {
        myfile >> temp;
        line [i] = temp;
        cout << line[i] << " ";
        i++;
    }
    cout << endl;
    i=0;
    while (!myfile.eof())
    {
        myfile >> temp;
        para[i] = temp;
        cout << para[i] << " ";
        d++;
        i++;
    }

 myfile.close();
}

else cout << "Unable to open file";

cout << endl << endl << i << endl << para[73] << endl;

return;

}

int main()
{
  int const SIZE = 100;
  string a [SIZE];
  string b [SIZE];
  int counter = 0;

  read(a, b, counter);

  cout << endl << endl << counter << endl;


  return 0;

}

输入:

  

谁的节目是这样的?       有重要的计划要做,而汤米被要求这样做 - 汤米确信萨姆会这样做 - 参孙本可以做到的   这样,但是Nicholsonnders这样做了--Sam对此感到生气,因为   这是汤米的节目 - 汤米认为参孙可以做到这一点但是   Nicholsonnders意识到Tommy不会这样做 - 结果就是这样   当Nicholsonnders做了参孙本可以做的事情时,汤米责备萨姆 -

2 个答案:

答案 0 :(得分:0)

我并不完全理解你想用它做什么,但这里是一个如何在保持标点符号和空格分开的同时对段落进行标记的示例。我使用向量而不是数组,但它应该很容易切换:

#include <vector>
#include <fstream>
#include <ctype.h>
#include <iostream>
#include <string>

class Words {
  std::vector<std::string> words_;
  bool lastCharacterIsAlphaNumeric_;

  void addAlphaNumeric(char character);
  void startNewWord(char character) {  words_.emplace_back(1, character); }
  void addNewWordForNonAlphaNumeric(char character);
  void clear() { words_.clear(); lastCharacterIsAlphaNumeric_ = false; }

public:
  Words() : lastCharacterIsAlphaNumeric_(false) {}
  void read(std::string filename);
  void print() { for(auto& word : words_) std::cout << word << std::endl; }
};

void Words::addAlphaNumeric(char character) {
  if (!lastCharacterIsAlphaNumeric_) {
    startNewWord(character);
    lastCharacterIsAlphaNumeric_ = true;
  } else {
    words_.back().push_back(character);
  }
}

void Words::addNewWordForNonAlphaNumeric(char character) {
  startNewWord(character);
  lastCharacterIsAlphaNumeric_ = false;
}

void Words::read(std::string filename) {
  clear();
  std::ifstream myfile (filename);
  char tmp;

  while(myfile.good()) {
    myfile.get(tmp);
    if(isalnum(tmp)) {
      addAlphaNumeric(tmp);
    } else {
      addNewWordForNonAlphaNumeric(tmp);
    }
  }
}

int main()
{
  Words words;
  words.read("paragraphwordsub.txt");
  words.print();
}

答案 1 :(得分:0)

如果我正确理解了这个问题,你想在输入中找到子串“ - ”的每一个匹配项,并用子串“。”替换它。

您可能一直希望因为运营商&gt;&gt;从输入中一次读取一个“单词”,它将在“程序”的最后一个字母后停止;但实际上它只在涉及空格或输入结束时停止。似乎可能会有一个流操作器,你可以用它来告诉它停止标点符号,但我不知道任何这样的操纵器。

您可以尝试这样的事情:

myfile >> temp;
size_t position = temp.find("-");
while (found!=std::string::npos) {
  temp.replace(position, 1, ".");
}

如果你使用字符串变量而不是文字“ - ”和“。”,你可以推广它以进行你想要的任何替换(但是然后在replace()的参数中代替常量1,你必须使用要替换的子串的长度。)