编写一个程序,输入为一个字符和一个字符串,输出为该字符在字符串中出现的次数。如果字符出现的次数不正好为 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;
}
要读取其中有空格的输入,您需要使用
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;
}
C++ 输入/输出操作比乍看起来更复杂。
最大的问题是理解格式化输入和未格式化输入的区别。正如您可以在 here 中看到的那样,所谓的“提取”运算符
>>
是一个格式化的输入函数。它读取您在键盘上键入的字符并将它们“格式化”为您想要的数据类型。
您可能想在这里阅读更多相关信息。
注意事项之一是,如果遇到所谓的“空白”,字符串运算符的“extraction”将停止读取字符。这是一个例如由 std::isspace.
检测到的字符所以,如果你输入一个像“Hello world”这样的句子,并尝试用“提取”运算符
>>
读取这个字符串,你将只读取到“Hello”,因为“Hello”后面跟着空白字符' '
。
所以,您看到我们需要为您的字符串使用不同的输入函数。那就是无格式输入函数std::getline。此函数将读取所有字符,直到它看到(默认情况下)' '(“输入”字符)。
OK,好,那我们用
>>
读字符,用std::getline
读字符串。但是,不幸的是,当您首先使用格式化输入函数读取内容,然后使用未格式化输入函数读取内容时,通常会出现问题。问题是,格式化输入函数不会消耗它后面的“空白”字符。这可以是空格或 '
'(“输入”)字符。并且因为std::getline
在看到(默认情况下)后停止阅读'
',它将读取一个空字符串。
让我们在一个例子中解释一下:
Hello World
在屏幕上看起来像
n
Hello Word
在后台会发生以下情况
>>
运算符来读取一个字符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;
}
最大的错误是用
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。一个相当简单的更改将使其符合旧标准。