如果'来自'并且'切换'语句

时间:2016-03-13 21:01:51

标签: c++

我正在构建一个程序,要求用户输入,然后根据用户选择的选项调用相应的函数。 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个月后)我仍然不知道这段代码有什么问题。

1 个答案:

答案 0 :(得分:3)

原因是您混合了输入样式...在您的案例中cin >> ...后跟cin.getline()

operator>>()通常会在遇到待处理的换行符('\n')时停止,并将该换行符留在流缓冲区中以供后续操作读取。

getline()在遇到换行符时停止,从流中删除换行符,然后立即返回。

因此,如果要读取的第一个字符是换行符,则operator>>()读取一个字符,然后是getline(),将立即从两个字符返回。

要解决这个问题,不要在任何流上混合输入样式(在不同的流上使用不同的输入样式没有问题)。始终使用格式化流操作符(cin >> ...),或始终使用面向行的输入(例如cin.getline())或面向字符的输入(例如cin.get())。但是不要在同一个流上使用其中一个,因为它们之间的相互作用会产生不良影响。

如果您花了几个月的时间寻找解决方案,那么您看起来并不够。互联网上有很多这类东西的例子和解释。我猜(叹息!)我刚刚再添加一个。