我正在构建一个程序,要求用户输入,然后根据用户选择的选项调用相应的函数。 main()应该调用fourCode(),它连续有两个do-while
循环。当main()调用fourCode()时,它会完全跳过:
std::cin.getline(message, 499);
当fourCode()中的代码被移动到main()或直接从main()调用时,它完美地工作,但是当被交换机调用时它不能在单独的函数中工作或if-else声明。这是为什么?
我花了几个月的时间研究这个项目和数小时的研究,一般是教程,书籍和互联网。我还向我的一位朋友展示了他已经用几种不同的语言编程了五年多,他说这应该有用,尽管他有点不合时宜。我已经没想完了。
#include <iostream>
void nullCreator(char, int);
void convert(int, int, char, char);
char charDisplay(int, char);
void fourCode(void);
void otherCode(void);
int main()
{
char code;
std::cout << "Please select the code you wish to work with.";
std::cout << "Press a for a, b for b, etc.\na - 4x4 Code";
std::cout << "\nb - other Code\n";
std::cin >> code;
std::cout << "Option selected: ";
switch (code)
{
case 'a':
std::cout << "a";
fourCode();
break;
case 'b':
std::cout << "b";
otherCode();
break;
default:
std::cout << "none\nThat is an invalide option. ";
std::cout << "You will have to restart the program.\n";
}
return 0;
}
void fourCode(void)//main 4x4 code function
{
// a few other variables declared
std::cout << "\n\nPlease enter a message.\n\n";
std::cin.getline(message, 499);
std::cout << "\n\n";
do
{
// code here
} while (character < 500);
newChar = 0;
do
{
// code here
} while (newChar < 500);
}
编辑:( 4个月后)我仍然不知道这段代码有什么问题。
答案 0 :(得分:3)
原因是您混合了输入样式...在您的案例中cin >> ...
后跟cin.getline()
。
流operator>>()
通常会在遇到待处理的换行符('\n'
)时停止,并将该换行符留在流缓冲区中以供后续操作读取。
getline()
在遇到换行符时停止,从流中删除换行符,然后立即返回。
因此,如果要读取的第一个字符是换行符,则operator>>()
读取一个字符,然后是getline()
,将立即从两个字符返回。
要解决这个问题,不要在任何流上混合输入样式(在不同的流上使用不同的输入样式没有问题)。始终使用格式化流操作符(cin >> ...
),或始终使用面向行的输入(例如cin.getline()
)或面向字符的输入(例如cin.get()
)。但是不要在同一个流上使用其中一个,因为它们之间的相互作用会产生不良影响。
如果您花了几个月的时间寻找解决方案,那么您看起来并不够。互联网上有很多这类东西的例子和解释。我猜(叹息!)我刚刚再添加一个。