为什么我不能使用"获取功能"使用" cin功能"在开发c ++?

时间:2013-05-31 10:33:08

标签: c++ dev-c++

这是我的代码:

#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>

main()
{
      char a[120];
      int b;

      cout<<"age : ";
      cin>>b;

      cout<<"Name : ";
      gets(a);

      cout<<"Name : "<<a<<endl;
      cout<<"age  : "<<b;
      cout<<endl;

      system("pause");
      return 0;
}

输出: 年龄:20 //我打20 名称:名称://不要求输入名称。 年龄:20岁 按任意键继续......

但是,如果我先使用gets(a),那就没关系。

#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>

main()
{
      char a[120];
      int b;

      cout<<"Name : ";
      gets(a);

      cout<<"age : ";
      cin>>b;

      cout<<"Name : "<<a<<endl;
      cout<<"age  : "<<b;
      cout<<endl;

      system("pause");
      return 0;
}

输出: 姓名:约翰//我输入约翰。 年龄:20 //我输20岁。

姓名:约翰 年龄:20岁 按任意键继续......

他们发生了什么......请帮助......

2 个答案:

答案 0 :(得分:5)

无论你现在正在学习什么书/网络教程,都要把它扔掉。不,真的。这段代码看起来好像是1992年写的。Here is the list of books recommended by Stack Overflow community.

另外,如果你的Dev-C ++版本是4.9.9.2,我强烈推荐更新 - 更新的IDE将提供更好的编辑器,更好的调试器,以及(非常重要)更好的编译器。更好的编译器会给你更好的错误信息,这对学习C ++很重要(相信我,我从经验中知道)常见的替代方案是:Visual C ++,Code :: Blocks或者你喜欢Dev-C ++,只需升级到Orwell DEV-C ++。

让我们现在快进到2013年。

<强>警告

有几个笑话可以简化为“meh,我听错误而不是警告”。他们错了。 95%的警告意味着代码错误。由于C ++是一种棘手的语言,每个人都应该在他们的IDE中启用警告(让我想到为什么默认情况下不启用它们)。

<强>接头

向C ++引入名称空间意味着旧标题已弃用。这意味着在编写新代码时不应使用它们。

标题名称更改如下:

  • 内置C ++标头末尾没有“.h”。 (“iostream.h” - &gt;“iostream”)

  • 源自C的标题末尾没有“.h”,也有“c”前缀(“stdio.h” - &gt;“cstdio”)

  • conio.h既不是内置C头也不是内置C ++头,所以名称保持不变。

Here is list of standard headers

<强>字符串

C ++有一个字符串类型。 std::string。它允许简单的字符串操作而不会有麻烦。只需#include <string>即可使用它。

string first_name = "John";
string surname = "Titor";
string full_name = first_name + " " + surname; //easy concatenation

//string a = "first" + " " + "name" //nasty surprise

string c = "first" + string(" ") + "name" //much better
//or using stringstream (#include <sstream>)
stringstream ss;
ss << "first" << " " << "name";
c = ss.str();

<强>得到()

此功能无法安全使用 - 它不会限制用户输入也不会扩展缓冲区。在您的示例代码中,有人可以输入超过120个字符并最终调用未定义的行为。这个术语相当于数学的未定义行为 - 任何事情都可能发生,包括1等于2. gets()函数最近完全从C语言中删除。 C ++有一个安全的替代方案。

string s;
getline(cin, s);

正确声明main()

int main()

int main(int argc, char* argv[])

答案 1 :(得分:0)

避免同时使用iostream和stdio中的函数。

但是,您的问题是由额外的Enter引起的。

当您输入年龄并按Enter键时,cin仅包含该号码。 Enter传递给gets(),因此会直接返回。

修复可能是

#include<iostream>
#include<stdio.h>
#include<string>

using namespace std;

main()
{
    char a[120];
    int b;

    cout<<"age : ";
    cin>>b;

    cin.ignore();  //add this line to eat the enter

    cout<<"Name : "<<flush;
    gets(a);

    cout<<"Name : "<<a<<endl;
    cout<<"age  : "<<b;
    cout<<endl;

    system("pause");
    return 0;
}