今天在实验课上与几位同学讨论C++问题,在研究到第五个实验时意识到要用getline改善输入。

发现在VC6中,第一次调用getline函数需要连续输入两次回车键才能正常结束一次输入。但是留在流中的第二个回车(\n)被第二次getline获取并结束了该次输入。也因多输入了一个换行回车导致无法获取第二次输入的内容。下面是测试代码:

以上代码仅在VC++ 6.0中才出现,本人测试环境(VS6.0 Enterprice),并且在VS2008+和MinGW GCC4.8环境中验证无此现象。为了进一步测试是否仅在第一次调用getline函数时才出现此现象,用修改后的代码做了进一步测试:

上述代码表明只有第一次调用getline函数时才出现此现象。(大家可以进一步验证,然后回帖告知,不胜感激)
VC++6 这个IDE是早在1998年发布的,当时C++98标准也才刚发布,所以VC6对标准的支持是有限的。更何况现在C++11标准都发布几年了,对于VC6真心感觉OUT了。

差了下资料,上述问题有一个不错的解决方案——修改VC6的string头。

打开string文件,文件在VC98/INCLUDE/目录下,也可以右击<string>->Open Document <string>,找到

将其修改为:

修改完后保存string再点Build -> Clean 清理掉之前构建的程序,再Build就可以体验新的变化了。

 

我还发现不少人使用string.h引入string类,这是错误的。C++出于兼容性考虑包含了C的库,string.h这个头就是为兼容而存在的。C++中的.h已经不再是C语言中简简单单的头文件(仅用于声明),现在在C++中类的定义体也是放在头中的,甚至一些模板的实现都放在头文件中了。

如果想使用C++标准string类,只能

#include <string>

然后在使用的时候std::string 或using namespace std;

至于iostream.h 为什么可用,那是因为用于兼容AT&T C++风格(未标准化前)的。而且iostream在功能上要比iostream.h要强悍,后者仅仅支持字符流。

PS: 个人推荐使用VS2012或基于MinGW的开源IDE,视情况而定,就轻便而言MinGW系列的更方便携带且简单易操作(CFree、wxDev C++等);就Windows下开发而言,没什么比它自家的东西更懂自己了(VS系列)。以上均可找班长要拷贝。