如何计算c ++中字符串中的空格出现次数

时间:2012-10-18 17:01:14

标签: c++ string file-io

我有一个高级c ++类的项目应该做很多事情,但我首先要关注这个函数,因为在它工作之后我可以调整它以满足其他需求。此功能搜索文件并通过计算文档中出现的次数来执行字数统计。也许不准确,但它将是一个很好的起点。这是我现在的代码:

void WordCount()
    {
        int count_W = 0; //Varaible to store word count, will be written to label
        int i, c = 0; //i for iterator
        ifstream fPath("F:\Project_1_Text.txt");
        FileStream input( "F:\Project_1_Text.txt", FileMode::Open, FileAccess::Read );

        StreamReader fileReader( %input );
        String ^ line;
        //char ws = ' ';
        array<Char>^ temp;

        input.Seek( 0, SeekOrigin::Begin );

        while ( ( line = fileReader.ReadLine() ) != nullptr )
            {
                Console::WriteLine( line );
                c = line->Length;
                //temp = line->ToCharArray();

                for ( i = 0; i <= c; i++)
                {
                    if ( line[i] == ' '  )
                            count_W++;
                }

                //line->ToString();
            }

        //Code to write to label
        lblWordCount->Text = count_W.ToString();
    }

除了一个问题外,所有这些都有效。当我尝试运行该程序,并打开该文件时,我收到一个错误,告诉我索引超出范围。现在,我知道这意味着什么,但我不知道问题是如何发生的。而且,如果我不知道是什么导致了这个问题,我无法修复它。我已经读过可以使用for循环搜索字符串,当然对于char数组也是如此,并且在那里有代码来执行该转换,但在这两种情况下我都得到相同的错误。我知道它正在正确读取文件,因为最终程序还必须执行字符计数(这是有效的),并且它从头到尾完美地读回目标文档中每一行的大小。无论如何,我没有想法,所以我认为我会咨询更高的权力。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

计算空格很简单:

int spaces = std::count_if(s.begin(), s.end(),
                           [](unsigned char c){ return std::isspace(c); });

但有两点说明:

  1. std::isspace()无法立即与char一起使用,因为char可能会被签名而std::isspace()需要int才能获得肯定。
  2. 这会计算空格数,而不是单词数(或单词-1):单词可以由多个连续空格组成的空格序列分隔。

答案 1 :(得分:1)

这可能是你的循环。你从i = 0到i = c,但是i = c太远了。你应该去i = c-1:

for ( i=0; i<c; i++)