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;
}