1

这是我的代码:

#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;
}

output : 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;
}

输出:名称:约翰//我输入约翰。age : 20 // 我输入 20。

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

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

4

2 回答 2

5

无论您现在正在学习什么书籍/互联网教程,都将其扔掉。不,认真的。这段代码读起来好像写于 1992 年。这里是 Stack Overflow 社区推荐的书籍列表。

此外,如果您的 Dev-C++ 版本是 4.9.9.2,我强烈推荐更新 - 更新的 IDE 将提供更好的编辑器、更好的调试器和(非常重要的)更好的编译器。更好的编译器会给你更好的错误信息,这在学习 C++ 时很重要(相信我,我从经验中知道)常见的替代方案是:Visual C++、Code::Blocks 或者如果你喜欢 Dev-C++,只需升级到 Orwell开发-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();

获取()

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

string s;
getline(cin, s);

main() 的正确声明

int main()

或者

int main(int argc, char* argv[])
于 2013-05-31T12:33:50.190 回答
0

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

但是,您的问题是由额外的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;
}
于 2013-05-31T10:47:16.130 回答