繁体   English   中英

为什么在dev c ++中使用“ cin函数”后不能使用“ gets函数”?

[英]why I can't use “gets function” after using “cin function” in 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;
}

输出:age:20 //我输入20 Name:Name://不需要输入name。 年龄: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;
}

输出:名称:John //我键入John。 年龄:20 //我输入20。

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

他们怎么了...请帮助...

无论您现在正在学习什么书/互联网教程,都将其丢弃。 不,认真 该代码看起来就像是在1992年编写的。 这是Stack Overflow社区推荐的书籍清单。

另外,如果您的Dev-C ++版本是4.9.9.2,我强烈建议您进行更新-较新的IDE将提供更好的编辑器,更好的调试器和(非常重要的)更好的编译器。 更好的编译器将为您提供更好的错误消息,这在学习C ++时很重要(请相信我,我从经验中知道)。常见的替代方法是:Visual C ++,Code :: Blocks或如果您喜欢Dev-C ++,只需升级到Orwell Dev-C ++。

现在让我们前进到2013年。

警告事项

有几个笑话可以简化为“嗯,我听错误而不是警告”。 他们错了。 95%的警告表示该代码错误。 由于C ++是一种棘手的语言,因此每个人都应该在自己的IDE中启用警告(让我困惑为什么默认情况下未启用警告)。

标头

C ++命名空间的引入意味着不赞成使用旧的标头。 这意味着在编写新代码时不应使用它们。

标头名称的更改如下:

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

  • 源自C的标头末尾没有“ .h”,也以“ c”开头(“ stdio.h”->“ cstdio”)

  • conio.h既不是内置的C头文件,也不是内置的C ++头文件,因此名称保持不变。

这是标准标题的列表

弦乐

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();

gets()

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

string s;
getline(cin, s);

正确声明main()

int main()

要么

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

避免同时使用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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM