这是我的代码:
#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岁 按任意键继续......
他们发生了什么......请帮助......
答案 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;
}