函数和c-风格字符串,string类
1. 将c-风格字符串作为参数的函数
如果要将字符串作为参数传递给函数,表示字符串的方式有三种:
char 数组
用引号引起的字符串常量
被设置为字符串的地址的char指针,上面三种选择的类型都是char指针,因此可以作为字符串的处理函数的参数
char ghost[15] = "galloping";(其余位置全部为'\0')
char * str = "galumphing"; 只有new的指针需要delete释放,防止操作内存泄漏
int n1 = strlen(ghost);
int n2 = strlen(str);
int n3 = strlen("gamboling");
strlen函数传入一个指针,统计从指针开始到非零字符的个数
例:统计一个字符串中某个字符出现的次数
2. 返回c-风格字符串的函数
例:输入一个字符,扩展该字符到指定长度的字符串
3. string
string类将string::npos定义为字符串的最大长度
a. 构造函数
构造函数的测试函数
b. string类的输入
对于c风格的字符串,有三种方式:
char info[100];
cin >> info;
cin.getline(info, 100) // read a line ,discard \n
cin.get(info, 100); // read a line, leave \n in queue
实际上上面两个函数只能读入99个字符,最后一位自动置为 \0
对于string类型的对象,有两种方式
string stuff;
cin >> stuff; // read a word
getline(cin, stuff); // read a line, discard \n 但是get(cin, stuff)不可用
char* 和string类型都有一个可选参数,用于指定使用哪个字符来确定输入的边界。边界字符不会录入。
cin.getline(info, 100, ':");
getline(cin, stuff, ':');
在功能上面,它们之间的主要区别在于string的版本getline()将自动调整string对象的大小,自动存储输入的字符。
char fname[10];
string lname;
cin >> fname; // could be a probelm if input size > 9 characters
cin >> lname; // can read a very, very long word
cin.getline(fname, 10); // may truncate input
getline(cin, fname); // no truncation
自动调整大小的功能能让string版本的getline()不需要指定读取多少个字符的数值参数。
另一个主要的区别在于读取c风格的字符串函数是istream函数,但是string版本是独立的函数。
string版本的getline()函数从输入中读取字符,并将其存储在目标string中,直到发生下面三种情况之一
到达文件尾,在这种情况下,输入流的eofbit将被设置,意味着fail()方法和eof()方法都会返回true
遇到分界字符(默认为\n),在这种情况下,将分解字符从输入流中删除,但是不会存储它
读取到字符数达到最大允许值(string::npos和可供分配的内存字节数中较小的那一个),在这种情况下,将设置输入流的failbit,这意味着方法fail()将返回true
输入流对象有一个统计系统,用于跟踪流的错误状态,在这个系统中,检测到文件尾后设置eofbit寄存器,检测到输入错误时将设置failbit寄存器,出现无法识别的故障(如硬盘故障)将设置badbit寄存器,一切顺利设置goodbit寄存器
string版本的operator<<()函数行为与此类似,它不断读取,直到遇到空白字符并将其留在输入队列中,而不是不断的读取,直到遇到分界字符将其丢弃。空白字符指空格,换行符和制表符。更直白的说,是任何将其作为参数来调用isspace()时,该函数返回true的字符。
例:读取文件,windows系统中,c风格字符串中的\\转义序列表示一个斜杠
文件内容如下:
程序代码如下:
分析:第五行和第九行出现了换行原因,指定了分界符以后,换行符将被视为常规字符,因此tobuy.txt中第一行末尾的换行符将称为cottage cheese中的第一个字符,第二行末尾的字符也会成为第九个输入字符串的唯一内容。
c. 使用字符串
4. 字符串类型转换
atoi当解析的字符超出返回类型的范围时,会自动转换为该类型能够表示的最大值或者最小值