如果输入小于128个字符,我没有问题。 但是如果输入超过128个字符,则循环会一直传递,我会收到垃圾邮件:错误:您必须键入内容。 在关闭控制台并完成程序之前,我无法做某事。
似乎没有调用cin.getline()函数,命令变量总是为空。
我的计划是,命令太长了,我想要一个新的输入......
问题出在哪里???
...
#define MAX_COMMAND_LENGTH 128
int main()
{
char command[MAX_COMMAND_LENGTH];
while (1)
{
cout << "\nSend command: ";
cin.getline(command, MAX_COMMAND_LENGTH);
if ((strlen(command) == 0))
{
cout << "ERROR: You must type something." << endl;
continue;
}
else if (strlen(command) > MAX_COMMAND_LENGTH - 2)
{
cout << "ERROR: The command may only be 128 characters long." << endl;
continue;
}
...
}
return 0;
}
我也尝试过:cin.ignore(MAX_COMMAND_LENGTH,'\ n');,但它不起作用:S
答案 0 :(得分:0)
您的问题是,当getline找到的字符多于最大值时,会设置流的错误标记。 (请参阅std::basic_istream::getline
上的说明已提取count-1个字符(在这种情况下执行setstate(failbit))。
和
如果函数没有提取字符(例如,如果count <1),则执行setstate(failbit)。
以下对我有用: (抱歉,将最大值更改为10 ...保存了一些打字)
#define MAX_COMMAND_LENGTH 10
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char command[MAX_COMMAND_LENGTH+1];
while (1)
{
cout << "\nSend command: ";
cin.getline(command, MAX_COMMAND_LENGTH);
command[MAX_COMMAND_LENGTH]='\0';
if ((strlen(command) == 0))
{
cout << "ERROR: You must type something." << endl;
cin.clear(); // <--- reset the flags
continue;
}
else if (strlen(command) > MAX_COMMAND_LENGTH - 2)
{
cout << "ERROR: The command may only be 10 characters long." << endl;
cin.clear(); // <--- reset the flags
cin.ignore(MAX_COMMAND_LENGTH,'\n'); // <-- skip unred chars
continue;
}
cout << "Command received is: " << command << endl;
}
return 0;
}
输出结果为:
Send command:
ERROR: You must type something.
Send command: 1
Command received is: 1
Send command: 12
Command received is: 12
Send command: 123
Command received is: 123
Send command: 12345678
Command received is: 12345678
Send command: 1234567890
ERROR: The command may only be 128 characters long.
Send command: 12345678901
ERROR: The command may only be 128 characters long.
Send command: 12345678
Command received is: 12345678
Send command: 1234
Command received is: 1234
Send command:
答案 1 :(得分:0)
您需要更仔细地阅读getline的文档。
它说getline将从流中读取字符
直到发生以下任何一种情况(按所示顺序测试):
文件结束条件发生在输入序列中(在这种情况下 setstate(eofbit)执行)
下一个可用的字符c是分隔符,由确定 特征:: eq(c,delim)。提取分隔符(不同于 basic_istream :: get())并计入gcount(),但未存储。
已提取count-1个字符(在这种情况下) setstate(failbit)被执行)。
您将达到最后一个条件,因此将设置failbit。设置完成后,您将无法继续操作,直到您通过调用clear清除错误情况为止。
另请注意,您不需要按照自己的方式检查返回字符串的长度。您只需要检查failbit以确定是否超出了缓冲区。
最后请注意,您可以使用gcount()
找出实际读取的字符数