2011-11-04 73 views
0

以前我是C程序员(想知道更多关于系统编程的知识,但不想进入汇编,所以我选择C),但后来在我的大学I必须采取C++,我实际上很难使用cincout对象,因为它与我信任的printf(),scanf(),getchar()宏相比有一些变化。这是代码。使用cin对象进行输入验证并清除缓冲区(C++)

守则

int main(void) 
{ 
    using namespace std; 

    cout << "What is the number?\n\n"; 
    cout << "#Number :"; 
    cin >> num; 

    while(cin.fail()) 
    { 
     cin.clear(); 
     cin.ignore(1000 , '\n'); 
     cout << "Please enter a number\n\n"; 
     cout << "#Number :"; 
     cin >> num; 
    } 

    return 0; 
} 



问题

1)我想这个代码,请从用户(小于号和大于或等于0),当用户输入一个字符或字符串时,我希望它提醒用户,清除输入缓冲区并重新提示用户输入新的值e直到它是一个数字。

2.)所以我只是用google搜索并找到一个页面传播方法,所以我只是按照方式,但它失败了。我不知道为什么一旦我运行这个代码,键入一个字符它将导致无限循环的输出Please enter a number。在这段代码中我犯的任何错误?

谢谢你花时间阅读我的问题

P/S:我使用的代码块与MinGW的编译器。

回答

2

你不会说它是如何失败的,所以很难说你的问题 是什么。事实上,你永远不会声明num是一个明显的问题。如果输入的行长度超过1000个字符,它也会失败。

C++中更习惯的解决方案是逐行读取输入,使用std::getline,然后使用std::istringstream将行转换为数字。

+0

好的,谢谢,无论如何,在原始的源代码,我确实声明:)只是在这里我忘了添加行 – caramel1995

0

使用格式输入的标准方式是在对操作本身的条件检查中。另外,您需要阅读整行内容并尝试解析该标记,而不是通过标记提取标记。例如。像这样:

int num; 

for (bool success = false; !success;) 
{ 
    std::cout << "Please enter a number: "; 

    std::string line; 
    if (std::cin >> line) 
    { 
    std::istringstream iss(line); 
    if (iss >> num) success = true; 
    } 

    if (!success) { std::cout << "Error!\n"; } 
} 

std::cout << "Thank you. You said: " << num << std::endl; 

随意在错误分支中添加进一步的诊断输出。