C++ cin.getline() 不能在循环中工作
c++ cin.getline() does not work in loop
如果输入少于 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,'');,但它不起作用:S
您的问题是,当 getline 找到的字符数超过最大设置的字符数时,流的错误标志会被设置。(请参阅std::basic_istream:getline中的说明
计数-1 字符已被提取(在这种情况下,执行 setstate(failbit)。
和
如果函数不提取任何字符(例如,如果计数<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]=' ';
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:
您需要更仔细地阅读 getline 的文档。
它说getline将从流中读取字符
直到发生以下任何情况(按显示的顺序进行测试):
输入序列中出现文件结束条件(在这种情况下 setstate(eofbit) 被执行)
下一个可用字符 c 是分隔符,由下式确定 特征::eq(c, delim).提取分隔符(与 basic_istream::get()) 并计入 gcount(),但不存储。
已提取计数 1 个字符(在这种情况下 setstate(failbit) 被执行)。
您将遇到最后一个条件,因此将设置故障位。设置后,您将无法继续,直到您通过调用 clear 清除错误条件。
另请注意,您不需要以现在的方式检查返回字符串的长度。您只需检查故障位即可确定是否超出了缓冲区。
最后请注意,您可以使用 gcount() 找出实际读取了多少个字符
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 循环仅对第一行正常工作.其他行不受 for 的影响
- 当输入在带有空格的单行中给出时,cin 如何在 while 循环中工作?
- C++中循环和 C 样式数组的范围工作
- 在循环工作时,首先将两个文件读为向量,但仅次于迭代一次
- 试图让while循环工作,当输入符号而不是字符时会中断
- 循环工作时如何做到这一点?
- 有问题使循环工作与功能相结合
- 无法让 for 循环工作
- do while循环工作不正常
- c++不要循环工作
- 循环工作/不起作用,不知道为什么C++
- C++While循环工作
- c++:循环时出现TypeError,但在循环工作之前-(已修改)LinkedListClass迭代
- 循环工作不正常
- 什么代码可以使这个循环工作
- 我应该如何让我的for循环工作?for循环是全新的
- 我如何使这个循环工作
- 可以根据分配的循环工作范围
- Windows 8 APP,用数据绑定改变XAML文本框的文本.游戏循环工作线程导致问题