我正在为我的 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/

10-16 16:29