c cpp string in out summary

比较熟悉的大神可以飘过了。。。之前对于C C++ string char* 尤其是输入的一堆东西弄得晕头转向,主要是用getline 输入string来处理,但是
如果让写C风格的,可能我就挂了。。。

getline(istream& istr, string str, delim)//一般是用这个来输入字符串的

后来看到一个很像的cin.getline(char* str, delim=’\n’), 如果是读一行,还是建议写\n吧,默认参数这么多指不定那条搞晕了= = 如果是写C++,尽量用前者好像

于是后面有出来了 gets fgets scanf(), 这么一堆输入char的函数,gets网上说是不安全的,因为没有设置输入缓存区,有溢出的风险,尽量
用fgets去代替,但是谁知道呢:
fgets(char
str, int num, FILE stream),当然File 也可以传入stdin来表示从标准输入,有点奇怪,后来查了才知道stdin就是File*类型的。
但是我后来漏看了cplusplus文档,有个重要的漏了,就是fgets如果输入的最后有个\n,最后读到str里面的字符串也会加一个\n,这不得不说是个巨大的隐患,还是应该相信fawks大神的,
用gets,先不管隐患,至少目前编的代码还不会有溢出的隐患。

cin>>输入的话,默认delim 是 space \t 和\n,这个要记住,因为没有参数的,所以数字由于中间不可能有这些delim,可以安全用,但是字符串不是通过
这些delim来区分的,所以完全可能中间有这些字符,用cin就悲剧了,cplusplus官网也说cin是notorious的,

scanf() ACMer C C++混编混C的部分主要是由于C++流输入输出比较慢,采用C的函数直接把输入写到内存地址处来提高效率。
scanf(“%d”, &x);记住这个是输入地址,和printf只需要print值不一样

另外要特别留意输入int之后的string,如果敲回车的话,因为fgets gets getline cin.getline 这一系列输入字符串都是默认\n结束的,而如果前面整数是敲回车结束的(多数是这样的),那么
后面输入字符串的就是空串,因为\n还留在输入缓冲区里,那么这些读取直到\n就相当于读了空串了,所以最好之前再读取一次把空串读掉,其实scanf(%c)会有这个问题,scanf(%s) cin不会存在这个问题,但是字符串中间又空格就截断了。

总结下来tips就是,输入C字符串用gets可以不指定长度,感觉似乎方便,如果不写大的项目,隐患也还好,fgets需要指定长度和源stdin,可能麻烦点,也可以用cin.getline,而且这个优点在于还有
delim参数,因此如果有其他要求的话可能只能用cin.getline了。

C++字符串必须是getline(cin,str,delim=’\n’),输入字符串特别当心前面有int输入的时候,是否留了一个\n在缓冲区里,之前还有做法是cin.clear来清空。
另外stdin和cin是同步的,cin是C++的,但是好像stdin好像是标准输入,默认是键盘,如果需要freopen重定向的时候,一般都用stdin

基本delim默认都是\n, 例如getline(string::getline), cin.getline(istream::getline), cin是空格,\t \n来区分整数或者字符串的,用在字符串可能就挂了。

特别注意cin.getline(char*str, int num, delim=’\n’) 里面的num是指包含结束符的

另外今天看到一个代码还是不清楚为啥

#include <iostream>
using namespace std;
int main()
{
    char str[8];
    cin.getline(str, 5);
    cout<<str<<endl;
    cin.getline(str, 5);
    cout<<str<<endl;
    return 0;
}

代码来自 http://www.cnblogs.com/A-Song/archive/2012/01/29/2331204.html 对notorious的cin进行了一番批评似乎

34哥说过了,因为有一个问题,第一次输入就因为截断了,flag置1,然后后面就不读了。

Posted by richard爱闹 - 7月 21 2014
如需转载,请注明: 本文来自 Richard