C++输出某个字符在句子中出现的次数有问题

问题描述 投票:0回答:3

编写一个程序,输入为一个字符和一个字符串,输出为该字符在字符串中出现的次数。如果字符出现的次数不正好为 1,则输出应包括输入字符并使用复数形式 n's。

Ex:如果输入是:

n Monday

输出是:

1 n

Ex:如果输入是:

z Today is Monday

输出是:

0 z's

Ex:如果输入是:

n It's a sunny day

输出是:

2 n's

案件很重要。

Ex:如果输入是:

n Nobody

输出是:

0 n's

n
不同于
N
.

我试过了,但无法正常工作。请帮我解决这个问题。

#include <iostream>
#include <string>
using namespace std;

int CalcNumCharacters(string userString, char userChar) {
    int count = 0;
    for (int i = 0; i << userString.length(); i++) {
        if (userString[i] == userChar) {
            count++;
        }
    }
    return count;
}

int main() {
    char uchar;
    string ustring;
    cin >> uchar;
    cin >> ustring;

    int counting = CalcNumCharacters(ustring, uchar);
        cout << counting << " " << uchar << "'s" << endl;
    }
    return 0;
}
c++ count character
3个回答
0
投票

要读取其中有空格的输入,您需要使用

std::getline()
而不是
operator>>
,例如:

#include <iostream>
#include <string>
using namespace std;

int CalcNumCharacters(const string &userString, char userChar) {
    int count = 0;
    for (int i = 0; i < userString.length(); ++i) {
        if (userString[i] == userChar) {
            ++count;
        }
    }
    return count;
}

int main() {
    char uchar;
    string ustring;

    cin >> uchar;
    getline(cin, ustring);

    int counting = CalcNumCharacters(ustring, uchar);
    cout << counting << " " << uchar << (counting != 1 ? "'s", "") << endl;

    return 0;
}

0
投票

C++ 输入/输出操作比乍看起来更复杂。

最大的问题是理解格式化输入和未格式化输入的区别。正如您可以在 here 中看到的那样,所谓的“提取”运算符

>>
是一个格式化的输入函数。它读取您在键盘上键入的字符并将它们“格式化”为您想要的数据类型。

您可能想在这里阅读更多相关信息。

注意事项之一是,如果遇到所谓的“空白”,字符串运算符的“extraction”将停止读取字符。这是一个例如由 std::isspace.

检测到的字符

所以,如果你输入一个像“Hello world”这样的句子,并尝试用“提取”运算符

>>
读取这个字符串,你将只读取到“Hello”,因为“Hello”后面跟着空白字符
' '

所以,您看到我们需要为您的字符串使用不同的输入函数。那就是无格式输入函数std::getline。此函数将读取所有字符,直到它看到(默认情况下)' '(“输入”字符)。

OK,好,那我们用

>>
读字符,用
std::getline
读字符串。但是,不幸的是,当您首先使用格式化输入函数读取内容,然后使用未格式化输入函数读取内容时,通常会出现问题。问题是,格式化输入函数不会消耗它后面的“空白”字符。这可以是空格或 ' '(“输入”)字符。并且因为
std::getline
在看到(默认情况下)后停止阅读' ',它将读取一个空字符串。

让我们在一个例子中解释一下:

  1. 你输入了一个应该被计算在内的字符'n'
  2. 然后按回车键
  3. 现在输入
    Hello World
  4. 最后再次按下回车键

在屏幕上看起来像

n
Hello Word

在后台会发生以下情况

  • 你使用
    >>
    运算符来读取一个字符
  • 这将(默认情况下)跳过前导空格
  • 字符 n 将从输入流中取出并放入您的变量 'uchar'
  • 换行符 ' ' 按“Enter”键生成的内容将保留在输入流中
  • 现在,您尝试使用
    std::getline
  • 获取字符串的其余部分
  • std::getline
    首先看到的就是上面提到的换行符
  • 然后,您的字符串变量中不会读取任何内容

有一个标准解决方案:称为 std::ws。这将从输入流中丢弃前导空格(因此,在我们的例子中 ' ').

对于从格式化输入到未格式化输入的所有转换,请记住这一点。

现在这将导致第一个解决方案,只需对原始源代码进行微小更改。

#include <iostream>
#include <string>
#include <iomanip>
using namespace std;

int CalcNumCharacters(string userString, char userChar) {
    int count = 0;
    for (int i = 0; i < userString.length(); i++) {
        if (userString[i] == userChar) {
            count++;
        }
    }
    return count;
}

int main() {
    char uchar;
    string ustring;
    cin >> uchar;
    getline(cin >> ws, ustring);

    int counting = CalcNumCharacters(ustring, uchar);
    cout << counting << " " << uchar << "'s" << endl;

    return 0;
}

但是还有一个额外的要求。处理输出中的“复数”形式。

为此,您需要将结果“计数”与 1 进行比较。

  • 如果是一个,输出没有复数
  • 对于任何其他值输出复数形式

有很多可能的解决方案,而且,大多数会直接在插入语句(输出)中使用三元运算符。我将在下面使用 if 语句:

#include <iostream>
#include <string>
#include <iomanip>
using namespace std;

int CalcNumCharacters(string userString, char userChar) {
    int count = 0;
    for (int i = 0; i < userString.length(); i++) {
        if (userString[i] == userChar) {
            count++;
        }
    }
    return count;
}

int main() {
    char uchar;
    string ustring;
    cin >> uchar;
    getline(cin >> ws, ustring);

    int counting = CalcNumCharacters(ustring, uchar);
    string potentialPlural = "";
    if (counting != 1) {
        potentialPlural = "'s";
    }

    cout << counting << " " << uchar << potentialPlural << endl;
}


-1
投票

最大的错误是用

std::cin
来读你的短语。它将在第一个空格处停止阅读。

您需要使用

std::getline()
,但是当您将它与
std::cin
混合使用时有一个警告。我不打算深入探讨为什么你需要小心,这个网站上已经有很多很好的答案。相反,我将演示其用法。我也会展示我的其他评论。

#include <algorithm>
#include <iostream>
#include <limits>
#include <string>

int main() {
  std::cout << "Character: ";
  char letter;
  std::cin >> letter;
  std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  
  std::cout << "Phrase: ";
  std::string input;
  std::getline(std::cin, input);
  int count = std::ranges::count(input, letter);

  std::cout << count << ' ' << letter
            << (count == 1 ? "\n" : "'s\n");
}

输出:

~/tmp 
❯ ./a.out 
Character: z
Phrase: Today is Monday.
0 z's

~/tmp took 4s 
❯ ./a.out 
Character: n
Phrase: It is sunny.
2 n's

~/tmp took 5s 
❯ ./a.out 
Character: n
Phrase: Monday
1 n

此代码需要 C++20。一个相当简单的更改将使其符合旧标准。

© www.soinside.com 2019 - 2024. All rights reserved.