【问题标题】:C++ simple IO vowel count programC++简单IO元音计数程序
【发布时间】:2012-02-29 11:16:26
【问题描述】:
char ch;
//Get data from user 
cout << "Enter your sentence on one line followed by a # to end it: " << endl;

while (cin >> character && character != '#') 
{
    cin.get(ch); 
    ch = static_cast<char>(toupper(ch));
    outFile << ch;

    if (character == 'A' || character == 'E' || character == 'I' || character == 'O'
                || character == 'U')
    {
        vowelCount ++;

    }
}
outFile << "number of vowels: " << vowelCount << endl;

我正在尝试输入一个句子,读取它有多少元音、空格和其他字符。但是 vowelCount 永远不会正确,我也无法让它将相同的句子写入输出文件。有什么提示吗?

【问题讨论】:

  • 您已经在阅读character。为什么要再次阅读ch?此外,您可能想了解元音是什么以及有多少个。
  • 更糟糕的是,读入character 也只是跳过了前导空格!你只想使用cin.get(ch) 之类的东西。另一个问题是 toupper() 的参数必须是正整数,但 char 在这种情况下可以签名,例如我的名字可能会使您的程序崩溃。你想使用toupper(static_cast&lt;unsigned char&gt;(ch))之类的东西。
  • 使用cin &gt;&gt; character 运算符将标准输入中的一个字符读入字符变量。执行cin.get(ch) 会将第二个字符读入 ch 变量。您只需要执行这些操作之一。删除cin.get(ch) 行并尝试将所有对character 的引用替换为ch
  • 当我写到 outFile 时,我怎么能用空格写说(字符)。
  • @mmodahl:您对cin &gt;&gt; character 行为的描述只有在设置了noskipws 标志时才是正确的(例如,使用std::cin &gt;&gt; std::noskipws)。否则,字符的格式化输入会跳过前导空格。这也应该回答关于如何写空格的问题。

标签: c++ io char while-loop file-io


【解决方案1】:

您尚未显示变量vowelCount 的声明/初始化。我假设您只使用如下语句声明(而不是初始化)它:

int vowelCount; // notice the variable is not initialized.

在 C++ 中,int 变量没有默认值。如果你写过这样的代码,你可以通过如下语句显式初始化它的值来纠正它:

int vowelCount = 0;

此外,您的循环在每次迭代时读取 2 个字符(跳过两个字符中的一个)并且您缺少元音 Y

更正后的示例如下所示:

//Get data from user 
cout << "Enter your sentence on one line followed by a # to end it: " << endl;

int vowelCount = 0;
while (cin >> character && character != '#') 
{
    character = toupper(character);

    if (character == 'A' || character == 'E' || character == 'I' || character == 'O'
                || character == 'U' || character == 'Y')
    {
        vowelCount ++;

    }
}
outFile << "number of vowels: " << vowelCount << endl;

【讨论】:

  • 考虑到他的下一个任务是计算空格,这有点误导。
  • OP 可以使用 cin &gt;&gt; noskipws and cin &gt;&gt; skipws manipulators 禁用/启用空格跳过,也可以改用 while (cin.get(character)) 语法。
  • 来自 Wiki:在基于拉丁字母的书写系统中,字母 A、E、I、O、U 和有时 Y 都用于表示元音。 'Y' 可能是他作业的可选内容。
【解决方案2】:

就像 pmr 的评论所表明的那样,问题是您在每次循环迭代时读取两个字符,但只检查第一个字符。这两个语句都使用标准输入中的一个字符:

cin >> character
...
cin.get(ch)

您需要做的就是:

while (cin >> character && character != '#') 
{
    character = static_cast<char>(toupper(character));

【讨论】:

  • 如何读取空格?一旦我掌握了元音,我就被困在阅读空白处。
猜你喜欢
  • 1970-01-01
  • 2020-03-24
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
  • 2011-05-05
  • 1970-01-01
  • 2013-11-26
相关资源
最近更新 更多