标准输入流cin 与流提取运算符 >> 结合使用,如下所示:
#include
using namespace std;
int main( )
{
char name[50];
cout << "请输入您的名称: ";
cin >> name;
cout << "您的名称是: " << name << endl;
}
C库函数scanf(const char *format, …) 从标准输入 stdin 读取格式化输入。
函数声明为int scanf(const char *format, ...)
format 说明符形式为:[=%[*][width][modifiers]type=]
type为一个字符,指定了要被读取的数据类型以及数据读取方式。常见的有。
scanf 类型说明符:
类型 | 合格的输入 | 参数的类型 |
---|---|---|
%c | 单个字符:读取下一个字符。如果指定了一个不为 1 的宽度 width,函数会读取 width 个字符,并通过参数传递,把它们存储在数组中连续位置。在末尾不会追加空字符。 | char * |
%d | 十进制整数:数字前面的 + 或 - 号是可选的。 | int * |
%e、%E、%f、%F、%g、%G | 浮点数:包含了一个小数点、一个可选的前置符号 + 或 -、一个可选的后置字符 e 或 E,以及一个十进制数字。 | float * |
%i | 读入十进制,八进制,十六进制整数 。 | int * |
%o | 八进制整数。 | int * |
%s | 字符串。这将读取连续字符,直到遇到一个空格字符(空格字符可以是空白、换行和制表符)。 | char * |
%p | 读入一个指针 。 |
如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。
#include
int main(void)
{
int a,b,c;
printf("请输入三个数字:");
scanf("%d%d%d",&a,&b,&c);
printf("%d,%d,%d\n",a,b,c);
return 0;
}
请输入三个数字:1 2 3
1, 2, 3
&a
、&b
、&c
中的&
是地址运算符,分别获得这三个变量的内存地址。
%d%d%d
是按十进值格式输入三个数值。输入时,在两个数据之间可以用一个或多个空格、tab 键、回车键分隔。
如果使用,
来分隔输入的 %d, 相应的输入时也需要添加,
:
#include
int main(void)
{
int a,b,c;
printf("请输入三个数字:");
scanf("%d, %d, %d",&a,&b,&c);
printf("%d, %d, %d\n",a,b,c);
return 0;
}
请输入三个数字:1, 2, 3
1, 2, 3
sprintf函数原型为int sprintf(char *str, const char *format, ...)
。作用是格式化字符串
format 说明符形式为:[=%[*][width][modifiers]type=]
type为一个字符,指定了要被读取的数据类型以及数据读取方式。同上。
具体功能如下所示:
(1)将数字变量转换为字符串。
(2)得到整型变量的16进制和8进制字符串。
(3)连接多个字符串。
#include
int main(){
char str[256] = { 0 };
int data = 1024;
//将data转换为字符串
sprintf(str,"%d",data);
//获取data的十六进制
sprintf(str,"0x%X",data);
//获取data的八进制
sprintf(str,"0%o",data);
const char *s1 = "Hello";
const char *s2 = "World";
//连接字符串s1和s2
sprintf(str,"%s %s",s1,s2);
cout<<str<<endl;
return 0;
getline:定义在namespace的全局函数,声明放在了文件中。
getline利用cin可以从标准输入设备键盘读取一行,当遇到如下三种情况会结束读操作:
(1)文件结束;
(2)行分割符的出现;
(3)输入达到最大限度。
函数原型有两种:
getline ( istream& is, string& str);【默认以换行符\n分隔行】
getline ( istream& is, string& str, char delim)。
#include
#include
using namespace std;
int main( )
{
string name;
cout << "请输入您的名称: ";
getline(cin,name);
cout << "您的名称是: " << name << endl;
}
库定义了三种类:istringstream
、ostringstream
和stringstream
,分别用来进行流的输入、输出和输入输出操作。
可以通过stringstream
实现任意类型的转换,模板如下。
template
out_type convert(const in_value & t){
stringstream stream;
stream<>result;//向result中写入值
return result;
}
下面的代码是将字符串s传递给流,再从流中将值传递给字符串t。
int main(){
string s = "1 23 # 4";
stringstream ss;
ss<<s;
string t;
while(ss>>t){
cout<<t<<" ";
int val = convert<int>(t);
cout<<val<<endl;
}
return 0;
}
输出为
1 1
23 23
# 0
4 4
C++ split分割字符串函数
将字符串绑定到输入流istringstream,然后使用getline的第三个参数,自定义使用什么符号进行分割就可以了。
#include
#include
#include
#include
using namespace std;
void split(const string& s,vector<int>& sv,const char flag = ' ') {
sv.clear();
istringstream iss(s);
string temp;
while (getline(iss, temp, flag)) {
sv.push_back(stoi(temp));
}
return;
}
int main() {
string s("123:456:7");
vector<int> sv;
split(s, sv, ':');
for (const auto& s : sv) {
cout << s << endl;
}
system("pause");
return 0;
}