我正在为我的 c++ 课做作业,自从我使用它已经有一段时间了。我想知道是否有办法在字符串中允许空格(而不是将字符串清空并结束)
我目前的代码是这样的:
int chapter10() {
string strinput;
char charstr[1000];
int numwords=1;
cout << "Enter a phrase ";
cin >> strinput;
cout << strinput;
const int size = strinput.size() + 1;
strcpy_s(charstr, strinput.c_str());
cout << strinput << endl;
for (int i = 0; i != size; i++) {
if (*(charstr + i) == ' ')
numwords++;
}
cout << "There are " << numwords << " words in that string." << endl;
return 0;
}
我遇到的问题是,例如,如果我输入“Hello World”并按回车键,它会弹出下一行(紧跟在 cin 之后)并说“Hello”,并且空格使它切断了短语的其余部分离开。
如何解决这个问题?我不想使用 str:: 东西,因为我几乎不知道它们是什么,而且真的从来没有使用过它们,这对老师来说看起来有点可疑:P
更新:如果您建议使用 getline(cin, strinput);它不太好用。我可以从我所看到的,只输入 10 来达到我的功能,但在我按下 Enter 后,它认为我按下了别的东西,这使得它完全跳过 cin 来获取字符串值。但是,这有点奇怪,如果我输入“10 hello world”,它会正确执行所有操作。好吧,除了它需要与到达函数的数字在同一行之外。
已解决:如果您没有事先使用用户输入,则使用 getline(cin, strinput) 可以正常工作。如果是,则在 getline() 之前需要一个 cin.ignore。正如我的最佳答案在评论中所述。
#include <iostream>
#include <iomanip>
#include <string>
#include <limits>
using namespace std;
//~~~Initialize all functions
int chapter10();
//~~~Initializing complete
int main() {
srand(time(0)); //makes rng thingy work instead of choose same numbers cause it doesn't do it on its own. lol
cout << "Enter the chapter number you need to look at: ";
int chapterNumber;
cin >> chapterNumber;
switch (chapterNumber) {
case 1: testingStuff(); break;
case 9: chapter9(); break;
case 10: chapter10(); break;
default: cout << "You chose an invalid chapter number, reload the program."; break;
}
system("pause");//So console doesn't close instantly cause that's not annoying at all...
}
int chapter10() {
string strinput;
char charstr[10000];
int numwords=1;
cout << "Enter a phrase." << endl;
cin.ignore(numeric_limits<streamsize>::max(), '\n');
getline(cin, strinput);
const int size = strinput.size() + 1;
strcpy_s(charstr, strinput.c_str());
for (int i = 0; i != size; i++) {
if (*(charstr + i) == ' ' & *(charstr + (i+1)) != ' ' )//the & is fail safe so multiple space no ++numwords
numwords++;
}
cout << "There are " << numwords << " words in that string." << endl;
return 0;
}
我编写代码的方式是使用 switch/case 来实现我的功能。这需要用户输入,这反过来又导致我的程序“认为”我仍在为第 10 章函数中所需的第二个输入输入。
添加一行代码:
cin.ignore(numeric_limits<streamsize>::max(), '\n');
允许我取消输入,并开始一个新的输入。 最佳答案
如果您想获得最终用户在一行中输入的所有字符,请使用 getline
: 而不是 cin >> strinput
写这个:
getline(cin, strinput);
它实际上是
std::getline(std::cin, strinput)
的事实没有区别,因为您的代码无论如何都使用 std
命名空间。如果您想知道 std::
前缀是什么,它是标准 C++ 库的命名空间。关于C++ 用户定义的字符串需要包含空格(但程序不允许..?),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34866134/