一、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语言中的sscanf、sprintf函数,c++中的I/O流strstream、stringstream-LMLPHP

二、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语言中的sscanf、sprintf函数,c++中的I/O流strstream、stringstream-LMLPHP

三、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;
}

运行结果
从字符串中读写的方法:c语言中的sscanf、sprintf函数,c++中的I/O流strstream、stringstream-LMLPHP

注意: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中。

06-09 07:37