如何检查字符串以查看C ++中是否存在回车符?

时间:2013-06-28 23:47:04

标签: c++ split return line

vector<string> wordstocheck;
in.open("readin.txt");

string line;
string word = "";
int linecount = 0;


while (getline(in, line))
{
    //cout << line << endl;
    for (int i = 0; i < line.size(); i++)
    {
        if(isalpha(line[i]))
        {
            word.push_back(tolower(line[i]));
        }
        else if (line[i] == ' ' || ispunct(line[i]) || line[i] == '\n')
        {
            wordstocheck.push_back(word);
            word = "";
        }

    }

linecount++;
}
for (int i = 0; i < wordstocheck.size(); i++)
    {
        cout << wordstocheck[i] << endl;
    }
system("pause");
}

上面的代码从.txt文件中读取以下内容:

 If debugging is the
 process of removing bugs.
 Then programming must be the
 process of putting them in.

我试图让程序识别每个单词,并将单个单词保存到向量中,然后打印出该单词向量。除了第一行和第三行中的两个&#39之外,它做得很好。

Output:
if
debugging
is
theprocess
of
removing
bugs
then
programming
must
be
theprocess
of
putting
them
in
Press any key to continue . . .

它没有分裂&#34;过程&#34;正如我所希望的那样。

4 个答案:

答案 0 :(得分:3)

getline不会阅读换行符。但是,在这种情况下,解决此问题相对简单。

您当前拥有linecount++;的位置,请在其前添加以下行:

   if (word != "")
   {
        wordstocheck.push_back(word);
        word = "";
   }

您可能希望在将if (word != "")推到word的第一个位置使用相同的wordstocheck,因为如果文字有“A Word”,则您需要添加该字词“A”后跟一个空字,因为秒空间触发要添加到列表中的单词。

作为替代方案,您可以摆脱getline,只需使用int ch = in.get()一次从输入中读取一个字符。然后,而不是计算while()...内的行,并通过循环使用ch而不是line[i] al,然后在else if部分中添加第二个,以检查换行并计算行数。这可能会缩短代码。

答案 1 :(得分:1)

我认为问题在于您希望换行符包含在getline()的结果中,而不是wordstocheck.push_back(word); word = ""; 。看起来如果你拿走那块你已经拥有的两条线:

linecount++;

并将它们添加到该行旁边:

{{1}}

然后它应该按预期工作。

答案 2 :(得分:0)

如果您想一次阅读一个字,为什么首先使用std::getline

// read the words into a vector of strings:
std::vector<std::string> words{std::istream_iterator<std::string(in),       
                           std::istream_iterator<std::string()};

您可以使用std::for_eachstd::transform将所有内容转换为小写字母,最后使用for (auto const &w : words) std::cout << w << "\n";

将其打印出来

答案 3 :(得分:0)

到目前为止,我知道,getline读取整行并且不识别回车。我知道的唯一方法是读取文件,通过char读取char。 这是一个给出正确结果的例子:

#include <iostream>     // std::cin, std::cout
#include <fstream>      // std::ifstream

int main ()
{
    char str[256];
    int line = 1;
    int charcount = 0;

    std::cout << "Enter the name of an existing text file: ";
    std::cin.get (str,256);

    std::ifstream is(str);
    if (!is)
    {
        std::cerr << "Error opening file!" << std::endl;
        return -1;
    }

    char c;
    while ((c = is.get()) && is.good()) // loop while extraction from file if possible
    {
        if (c == 10 || c == 13 || c == 32) // if it is a line break or carriage return or space
        {
            std::cout << std::endl;
            line++;
        }
        else // everything else
        {
            std::cout << c;
            charcount++;
        }
    }
    is.close();
    std::cout << std::endl;                // close file
    std::cout << line << " lines" << std::endl;
    std::cout << charcount << " chars" << std::endl;

    return 0;
}