1

我只做了 3 个月,目前处于静止状态。我不确定我做错了什么。如果有任何帮助指出我正确的方向,我将不胜感激。我不要求任何人为我做作业。我应该编写一个程序来接受用户的一行输入,然后计算并输出小写字母的数量。这是我到目前为止所拥有的,但它并没有做它应该做的事情。

#include <fstream>
#include <iostream>
#include <cctype>
#include <string>

using namespace std;

int main(){
    char text;
    int count = 0;
    cout << " Enter one line of text: ";

    do 
    {
        cin.get(text);

        while(text!='\n')
        {
            if(islower(text))
            count++;
        }
    } while(text!='\n');

    cout << count << "\n";
}
4

2 回答 2

3

问题在于输入:您输入了不同的字符,但会跳过空格。

您可以使用std::getline一次获取一行输入:

#include <algorithm>
#include <iostream>
#include <cctype>
#include <string>

using namespace std;

int main()
{
    cout << " Enter one line of text: ";
    string s;
    if(getline(cin, s))
    {
        size_t count = count_if(s.begin(), s.end(), 
               [](unsigned char ch) { return islower(ch); });
        cout << count << "\n";
    }
}
于 2012-11-25T01:50:42.193 回答
2

您创建一个无限循环:

while (text != '\n') {
    ...
}

如果text(对一个字符有点用词不当)碰巧与 '\n' 不同,它将永远持续下去。作为一般准则,每当您创建循环时,您都需要验证循环体是否以某种方式在循环结束时取得进展并且到达循环结束(当然,除非您打算创建一个无限lop)你可能只是想摆脱它while (...),只保留身体。

请注意,外部循环应该有两个终止条件:

  1. 如果您到达一行的末尾,它应该终止。
  2. 如果您到达输入的末尾,它应该终止:这不一定由换行符终止。

如果我要编写循环,它看起来像这样:

for (std::istreambuf_iterator<char> it(std::cin), end; it != end && *it != '\n'; ++it) {
    // do something with the `char` obtained from `*it`
}

还值得注意的是,您需要确保将正值传递给islower()(或来自 的任何其他函数<cctype>):有些系统char已签名,例如,ü以我的名义将转换为负值,导致调用时未定义的行为islower('ü')。避免这个问题的方法是在将其传递给函数之前将其转换char为an :的位模式与(假设是类型)的位模式相同。unsigned char<cctype>static_cast<unsigned char>(c)ccchar

坚持使用while-loop 读取 a的原始方法char,基本循环看起来像这样:

while (std::cin.get(text) && text != '\n') {
    if (std::islower(std::static_cast<unsigned char>(text))) {
        ++count;
    }
}

一般来说,我发现-loops 很少不会在生产代码中存活下来,这也不例外:如果可以成功读取do ... while,您只想进入循环。char由于换行符不是小写字母,因此也可以直接放入条件中。对于 ASCII 字符std::islower(text)可以工作,但为了使代码更可靠,我添加了一个演员表以unsigned char确保事情不会中断。最后,具有讽刺意味的是,增加变量的 C++ 习语是预增量,++count而不是count++. 主要用途是,如果应用它的类型不完全是微不足道的,那么它会更有效。由于 C++ 使用大量递增的迭代器,因此通常使用预递增。

于 2012-11-25T01:49:07.833 回答