Как сделать так, чтобы функция игнорирования удаляла и разделитель - PullRequest
0 голосов
/ 24 апреля 2020

Я хотел взять 10 символов и сохранить их в cstring и игнорировать остальные, но у меня возникли проблемы с этим. Программа не останавливается для ввода в следующий раз. Как я могу сделать так, чтобы он остановился и позволил мне войти снова.

#include <cstring>
#include <iostream>

using namespace std;

int main()
{

   char arr[11] = " "; //This is a cstring
   string x; //will test with this variable

   cout <<"Enter 10 character, rest will be ignored: \n";
   cin.getline(arr, 10,'\n');  
   cin.ignore();

   cout <<"Testing..\n";
   cin >>x;            //Should make the program halt

   cout <<arr <<endl;
   cout <<x;

}

1 Ответ

0 голосов
/ 24 апреля 2020

cin.getline(arr, 10,'\n') будет выводить не более 9 символов, а не 10 символов, останавливаясь, если разрыв строки читается до достижения 9 символов. Если вы хотите получить 10 символов, вам нужно установить для параметра count значение 11 - полный размер arr - чтобы включить место для 10 символов + нулевой терминатор.

Позвонив cin.ignore() впоследствии без каких-либо параметров будет игнорироваться только 1 символ. Таким образом, если пользователь вводит более count+1 символов, вы не игнорируете их все. Вы должны сказать cin.ignore() игнорировать все символы до следующего разрыва строки, если во время чтения не было достигнуто разрыва строки.

Попробуйте вместо этого:

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

using namespace std;

int main()
{
    char arr[11]; //This is a cstring
    string x; //will test with this variable

    cout << "Enter 10 character, rest will be ignored: \n";
    if (cin.getline(arr, 11, '\n'))
    {
        // <= 10 characters w/ line break were read
    }
    else
    {
        if (cin.fail() && !cin.bad()) // exactly 10 characters w/o a line break were read, ignore the rest...
        {
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
        }
    }

   cout << "Testing..\n";
   cin >> x;            //Should make the program halt

   cout << arr << endl;
   cout << x;
}

Это, как говорится, это C ++, а не C. Вместо этого было бы проще использовать std::getline(), например:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string str; //This is a c++ string
    string x; //will test with this variable

    cout << "Enter 10 character, rest will be ignored: \n";
    getline(cin, str);

    if (str.size() > 10)
        str.resize(10);

    cout << "Testing..\n";
    cin >> x;            //Should make the program halt

    cout << str << endl;
    cout << x;
}
...