我只做了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";
}
答案 0 :(得分: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";
}
}
答案 1 :(得分:2)
您创建了一个无限循环:
while (text != '\n') {
...
}
如果text
(某个字符的误称)恰好与'\ n'不同,将永远存在。作为一般准则,无论何时创建循环,您都需要验证循环体是否以某种方式在循环结束时进行并且到达循环结束(当然,除非您打算创建无限循环) lop)你可能只是想摆脱这个while (...)
而只是保持身体。
请注意,外部循环应该有两个终止条件:
如果我要编写循环,它看起来像这样:
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
转换为unsigned char
,然后再将其传递给<cctype>
函数:static_cast<unsigned char>(c)
的位模式与位模式相同c
(假设c
的类型为char
)。
坚持使用while
- 循环读取char
的原始方法,基本循环看起来像这样:
while (std::cin.get(text) && text != '\n') {
if (std::islower(std::static_cast<unsigned char>(text))) {
++count;
}
}
一般来说,我发现do ... while
- 循环很少不能存活到生产代码中,这也不例外:如果char
成功可能,你只想进入循环读。由于换行符不是小写字母,因此也可以直接输入。对于ASCII字符std::islower(text)
可以工作,但为了使代码可靠,我已经向unsigned char
添加了一个强制转换,以确保不会破坏。最后,具有增量变量的C ++习语具有讽刺意味的是增量,即++count
而不是count++
。主要用途是,如果应用它的类型并非完全无关紧要,则增量前提更有效。由于C ++使用了大量递增的迭代器,因此通常使用preincrement。