当前位置: 首页 > 知识库问答 >
问题:

c如果(cin>>输入)在while循环中不能正常工作

柴磊
2023-03-14

我对c不熟悉,我正试图解决Bjarne Stroustrup的书《编程原则和实践使用C》第四章中的练习6,但不明白为什么我的代码不起作用。

演习:

制作一个保持十个字符串值“零”、“一”、......、“九”的向量。在将一个数字转换为相应的拼写值的程序中使用它:例如,输入7给出输出7。有相同的程序,使用相同的输入回路,将拼写出来的数字转换成它们的数字形式;例如,输入7给出输出7。

我的循环只对一个字符串执行一次,对一个int执行一次,循环似乎在继续,但不管我输入什么,它都不做它应该做的事情。

有一次它对多个int输入有效,但仅每秒一次。这真的很奇怪,我不知道如何用另一种方式解决这个问题。

如果有人能帮我,那就太棒了。(我也不是以英语为母语的人,很抱歉,如果有错误的话)

这段代码中的库是随书提供的库,我想是为了让我们新手更容易开始。

#include "std_lib_facilities.h"

int main()
{
   vector<string>s = {"zero","one","two","three","four","five","six","seven","eight","nine"};

   string input_string;
   int input_int;

   while(true)
   {
        if(cin>>input_string)
        {
             for(int i = 0; i<s.size(); i++)
             {
                  if(input_string == s[i])
                  {
                       cout<<input_string<<" = "<<i<<"\n";
                  }
             }
        }

        if(cin>>input_int)
        {
            cout<<input_int<<" = "<<s[input_int]<<"\n";
        }

    }

    return 0;
}

共有2个答案

寇桐
2023-03-14

if(cin)

程序输入的可能实现如下所示:

std::string sentinel = "|";
std::string input;

// read whole line, then check if exit command
while (getline(std::cin, input) && input != sentinel)
{
    // use string stream to check whether input digit or string
    std::stringstream ss(input);

    // if string, convert to digit

    // else if digit, convert to string

    // else clause containing a check for invalid input
}

例如,要区分intstring值,可以使用peek()。最后两个转换操作(在intstring之间)最好由单独的函数完成。

假设包含标题:

#include <iostream> 
#include <sstream> 

夏建弼
2023-03-14

当您(成功地)从std::c中读取输入时,输入将从缓冲区中提取。缓冲区中的输入被删除,无法再次读取。

当您第一次作为字符串读取时,它也会将任何可能的整数输入作为字符串读取。

有两种方法可以解决这个问题:

>

  • 首先尝试读取为int。如果失败,清除错误并读取为字符串。

    以字符串形式读取,并尝试转换为int。如果转换失败,则您有一个字符串。

  •  类似资料:
    • 我正在编写一个程序,用户输入一个班级中的学生人数、该班级参加的考试次数,然后输入每个学生的姓名和考试分数。然后,程序计算学生的成绩,并分配给他们一个相应的字母等级。然后最后,它将他们的分数添加到一个classSum,计算平均类分数并显示出来。 这就是我目前所拥有的:public class GradeCalculator{ 这是我得到的输出: 正如您所看到的,在第一个学生之后,输入姓名和考试分数并

    • 我有一个while循环,它监视一个数据库,查看布尔值是否改变。如果在本地输入代码a,我希望这个while循环中断并停止监视数据库,即: 当循环运行时 代码为10个字符的整数,第一个数字始终为0。我尝试了以下各种方法来检测是否键入了内容: ...然而if语句运行,即使我没有键入任何内容。 程序在控制台中运行。有人知道如何解决这个问题吗?还有如何使用KeyEvent。键入键以检测零(0)字符?

    • 我需要在while循环之前输入一个用户,这样它就会知道程序是否想继续。问题是while条件的更内部看不到扫描仪之前输入的一行。有什么建议吗?

    • 我试图通过使用Kryonet进行通信来创建一个基本的IRC。我遇到的问题是,在我的代码中,我不能安全地使用允许用户键入和发送消息的main while循环,因为Scanner给出了一个错误,并且似乎跳过了对nextLine()的调用。我想做的是让扫描仪在继续之前等待用户输入。 更准确地说,程序将首先在行的开头放一个“:”,然后在用户按enter键后获取用户键入的任何内容,然后将其发送到服务器。我得

    • 在 C# 中,while 循环用于多次迭代一部分程序,特别是在迭代的次数不固定的情况下,建议使用 while 循环而不是 for 循环。while 循环的语法格式如下所示: while(表达式){     循环主体;         // 要执行的代码 } 其中,循环主体可以是一个单独的语句,也可以是多条语句组成的代码块,当表达式的为真时,循环会一直执行下去。 while 循环的执行流程如下图所示

    • C++ 循环 只要给定的条件为真,while 循环语句会重复执行一个目标语句。 语法 C++ 中 while 循环的语法: while(condition) { statement(s); } 在这里,statement(s) 可以是一个单独的语句,也可以是几个语句组成的代码块。condition 可以是任意的表达式,当为任意非零值时都为真。当条件为真时执行循环。 当条件为假时,程序流将