C风格字符串、string类要点总结

版权声明:转载请注明出处。 https://blog.csdn.net/sinich__eveen/article/details/86572524



1. C风格字符串

1.1 其它

  • 头文件<cstring>
  • 特殊性质:C风格字符串以空字符\0结尾

1.2 读取一行的区别

1.2.1 cin.getline(array1,n,char)

  • 参数1:存入的数组名字;参数2:要读取的字符数;参数3:可选参数,用所输入的char字符替代\n作为读取结束标记,并把后续可能遇到的\n作为常规字符读取。
  • 功能:读到换行符后边结束,并把'\n'替换为'\0',把读取到的字符串储存到name中
  • 遇到文件结尾设置eofbit,遇到流被破坏(如设备故障)时设置badbit
  • 遇到空行,不会设置failbit,不会退出while循环。因为getline()仍然抽取换行符,虽然不会储存它。如果希望getline()在遇到空行时终止循环,编写如下代码,e.g.char temp[80];while(cin.getline(temp,80) && temp[0]!='\0'); // terminates on empty line
  • 没有读取到任何字符,但换行符被视为读取了一个字符,设置failbit
  • 超过函数指定的最大字符,把余下的字符留在输入队列中,使用setstate()设置failbit,关闭后面的输入。

1.2.2 cin.get(array1,n,char)

  • 参数1:存入的数组名字;参数2:要读取的字符数;参数3:可选参数,用所输入的char字符替代'\n'作为读取结束标记,并把后续可能遇到的'\n'作为常规字符读取。
  • 功能读到换行符之前结束,把换行符留在输入队列中,并在结尾加上'\0',把读取到的字符串储存到array1中。
  • 遇到文件结尾设置eofbit,遇到流被破坏(如设备故障)时设置badbit
  • 可以用下面的命令来恢复输入:cin.clear()char temp[80];while(cin.get(temp,80)); // terminates on empty line
  • 超过函数指定的最大字符,把余下的字符留在输入队列中,不设置failbit。可用peek()查看下一个输入字符,来判断到底是到了文件尾停止,还是输入字符过多引起的。

1.2.3 ch=cin.get()

  • 读取下一个字符,即使是空字符或者换行符等;
  • 将函数返回值赋给ch;
  • 函数的返回值是字符编码(int 值);
  • 到达文件结尾的返回值EOF(EOF:头文件iostream提供的一个符号常量);
  • 到达文件尾不会给ch赋值,因为到了文件尾,就没有值了。(Windows命令提示符模式,按下Crtl+Z模拟文件尾)

1.2.4 cin.get(ch)

  • 读取下一个字符,即使是空字符或者换行符等
  • 赋给参数ch
  • 指向istream对象的引用
  • 到达文件结尾的返回值转换为false
  • 到达文件尾不会给ch赋值,因为到了文件尾,就没有值了。(Windows命令提示符模式,按下Crtl+Z模拟文件尾)

1.2.5 cin.ignore(int,char)

  • 第一个参数为数字,指定要读取的最大字符数;第二个参数是字符,用作输入分界符。
  • 函数原型为:istream& ignore(int=1,char=EOF),默认参数EOF导致ignore()读取指定数目的字符或读到文件尾。
  • 功能:读取并丢弃接下来的n个字符或直到到达第一个分解符。
  • 函数返回调用对象。

1.2.6 cin.peek():返回输入中的下一个字符,但不抽取输入流中的字符。

1.2.7 cin.gcount():返回最后一个非格式化抽取方法读取的字符数。

1.2.8 cin.putback():将一个字符插入到输入字符串中,被插入的字符将是下一条输入语句读取的第一个字符。返回

1.3 函数

  • strcpy(array1,array2):把array2中的字符串复制到array1中
  • strcat(array1,array2):把array2中的字符串添加到到array1中
  • void *memcpy(void *dest, const void *src, size_t n):从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中
  • strcat(array1,array2):比较两个字符串
  • sizeof():指出整个数组的长度一共多少字节
  • strlen():计算储存在数组中字符串的长度,而不是数组本身的长度;从数组的第一个元素开始计算字节数,知道遇到空字符

1.4 准确度问题

get()输入更仔细:假设用get()将一行读入数组中。如何知道停止读取的原因是由于已经读取了整行,而不是由于数组已填满呢 ? 查看下一个输入字符,如果是换行符,说明已读取了整行,否则,说明该行中还有其他输入。getline()使用起来简单一些,但get()使得检查错误更简单些。

1.5 计算长度和字节

  • strlen:计算字符串里面一共有多少个字符;
  • sizeof:计算字符串占的总内存空间;
    如:
char str[20]={"123456"};
strlen(str);    //等 6
sizeof(str);    //等于20

2. string类

2.1 其它

  • 头文件:<string>

2.2 读取一个单词

string str1;
cin >> str1;

2.3 读取一行

string str1;
getline(cin,str1);  //read a line, discard \n

2.4 控制符/函数

  • =:给string对象赋值
  • +:合并两个string对象
  • +=:字符串附加到string对象的结尾
  • str1.size():计算储存在数组中字符串的长度,而不是数组本身的长度
  • str1.length():等同于str1.size()
  • find()
  • str1.c_str():返回一个C-风格字符串

3. 两者相同点以及区别点

3.1 相同点

  • 都有一个可选参数,用于指定使用哪个字符来确定输入边界
cin.getline(str1,100,':')    //read up to :, discard :
cin.getline(array1,100,':')    //read up to :, discard :

3.2 区别

  • C-风格字符串,3种输入方式:
char array1[100];
cin >> array1;    //read a word
cin.getline(array1,100);    //read a line, discard \n
cin.get(array1,100);    //read a line, leave \n in queue
  • string对象,2中输入方式:
cin >> str1;     //read a word
string str1;
getline(cin,str1);      //read a line, discard \n
  • string类的getline()不需要指定读取多少字符,可以自动调整大小;C风格字符串的getline()不可以
  • string类getline()是独立函数;C-风格字符串的getline()istream的方法

猜你喜欢

转载自blog.csdn.net/sinich__eveen/article/details/86572524