一、sscanf、sprintf函数
众所周知,c语言中我们常使用的标准输入输出流函数为scanf()、printf(),默认从键盘上输入数据、向屏幕输出数据。此外,c语言中还提供了另一组库函数sscanf()、sprintf()函数,它们的功能与前者相同,只不过输入输出的对象为字符串。
这两个函数的原型为
#include <stdio.h>
int sscanf(const char *buffer, const char *format[, argument]...);
int sprintf(char *buffer, const char *format[, argument]...);
除了第一个参数外,其他参数的含义和用法实际上是与scanf()、printf()相同的。下面给举个例子。
#include <stdio.h>
struct student {
char name[20];
int age;
float score;
};
int main()
{
// 使用sscanf()函数从字符串中获取输入
char in_arr[50] = "Zhangsan 20 90.5";
struct student stu;
sscanf(in_arr, "%s %d %f", stu.name, &stu.age, &stu.score);
printf("%s, %d, %f\n", stu.name, stu.age, stu.score);
// 使用sprintf()函数向字符串中输出
char out_arr[50];
stu.age = 25;
stu.score = 85.0;
sprintf(out_arr, "%s %d %f", stu.name, stu.age, stu.score);
printf("%s", out_arr);
return 0;
}
运行结果为
二、c++中的istringstream、ostreamstring、stringstream
c++中的stringstream派生自iostream,将输入输出流定向至string对象中,已完成和sscanf/sprintf相似的效果。
需要包括头文件#include <sstream>
。
istringstream的作用是从string对象中读取,由istream中派生,构造函数原型
istringstream::istringstream(string str);
常用成员函数
str():使istringstream返回一个string字符串
ostringstream的作用是从string对象中读取,由ostream中派生,构造函数原型
ostringstream::ostringstream();
ostringstream::ostringstream(string str); 使用一个string初始化ostringstream,
常用成员函数
str():使ostringstream返回一个string字符串
stringstream的作用就是istringstream + ostringstream。
举个例子。
#include <iostream>
#include <sstream>
using namespace std;
struct student {
char name[20];
int age;
float score;
};
int main()
{
// 使用istringstream从字符串中获取输入
string in_str = "Zhangsan 20 90.5";
struct student stu;
istringstream strin(in_str);
strin >> stu.name >> stu.age >> stu.score;
cout << stu.name << ", " << stu.age << ", " << stu.score << endl;
// 使用ostringstream向字符串中输出
stu.age = 25;
stu.score = 85.0;
ostringstream strout; //建立输出字符串流,与数组out_arr建立关系,缓冲区长度为50
strout << stu.name << " " << stu.age << " " << stu.score;
cout << strout.str();
return 0;
}
运行结果为
三、c++中的istrstream、ostrstring、strstream
strstream的作用是与stringstream相同,不同的是strstream读写的是char *字符串,stringstream读写的是string类。
istrstream的构造函数原型为
istrstream::istrstream(char *buffer);
istrstream::istrstream(char *buffer, int n);
ostrstream的构造函数原型为
ostrstream::ostrstream(char *buffer, int n, int mode=ios::out);
strstream的构造函数原型为
strstream::strstream(char *buffer, int n, int mode);
举个例子。
#include <iostream>
#include <strstream>
using namespace std;
struct student {
char name[20];
int age;
float score;
};
int main()
{
// 使用istrstream从字符串中获取输入
char in_arr[50] = "Zhangsan 20 90.5";
struct student stu;
istrstream strin(in_arr);
strin >> stu.name >> stu.age >> stu.score;
cout << stu.name << ", " << stu.age << ", " << stu.score << endl;
// 使用ostrstream向字符串中输出
char out_arr[50];
stu.age = 25;
stu.score = 85.0;
ostrstream strout(out_arr, sizeof(out_arr)); //建立输出字符串流,与数组out_arr建立关系,缓冲区长度为50
strout << stu.name << " " << stu.age << " " << stu.score;
strout << ends; //ends是C++的I/O操作符,ostrstream不会自动补'\0',因此要手动添加'\0'
cout << out_arr;
return 0;
}
运行结果
注意:ostringstream下有一个构造函数ostringstream(string str),ostrstream的构造函数是ostrstream(char *buffer, int n),两者看起来很类似,第一个参数都是输出的string类/字符数组对象,但用法其实完全不同。
ostringstream(string str)中参数str的作用是初始化ostringstream类,例如代码
string str = "abcd";
ostringstream strout(str);
cout << strout.str();
则直接输出"abcd",这意味着str是向strout流中填充初始化数据的。
但ostrstream的用法为
char arr[10];
ostrstream strout(arr, sizeof(arr));
strout << "abcd" << ends;
cout << arr;
结果也是输出"abcd",但strout时是将其与字符数组arr绑定在一起,输出流是输出进arr中。