文章目录
字符串输入技巧
输入一行数字,数字之间有空格
头文件
#include <sstream>
string input;
getline(cin, input);
stringstream str(input);
int num;
vector<int> a;
while (str >> num) {
a.push_back(num);
}
- 读入不定长的字符串,可以有空格
while ((input = getchar()) != '\n') // 从输入流读取一个字符,如果这个字符不是\n
- 输入文件中的所有字符串,输入完则跳出
EOF文件读入结束符
while(scanf("%s", s)!=EOF)
- 按输入格式输入,否则输入结束。
while(scanf("%d", d)==1)
输入函数(gets、scanf、getline、cin)
gets函数
C11中已经抛弃该函数,不推荐使用。
- 调用格式
char str[100];
gets(s);
- 说明
- gets()从标准输入设备读字符串函数,其可以无限读取,不会判断上限,
以回车结束读取
,使用'\0'(C语言字符串结束标志)结尾
,回车符'\n'被舍弃没有遗留在缓冲区
- 如果前面使用过 gets(),而后面又要从键盘给字符变量赋值的话就不需要吸收回车清空缓冲区了
- gets()从标准输入设备读字符串函数,其可以无限读取,不会判断上限,
- 缺陷
gets()函数不会检查数组是否能够装的下输入行,可能会数组溢出。 - 适用范围
- 尽量避免使用
- 输入要求输入“包括空格”的一整行
- 注意输入数据大小和数组大小
fgets函数
可以替代gets函数
- 调用格式
# include <stdio.h>
char *fgets(char *s, int size, FILE *stream);
//s 代表要保存到的内存空间的首地址,可以是字符数组名,也可以是指向字符数组的字符指针变量名
//size 代表的是读取字符串的长度
//stream 表示从何种流中读取,可以是标准输入流 stdin,也可以是文件流
- 说明
- fgets最多读取size-1个字符串(留出一个给空字符)或者提前遇到换行符返回
- fgets()函数会读取换行符(这一点和gets函数不同),当读取结束后,fgets函数会为buf在末尾添加一个空字符作为字符串的结束,
即读入了字符串+'\n'+'\0',所以长度会比字符串多一,需要注意。
sscanf函数
- 调用格式:
int sscanf( string str, string fmt, mixed var1, mixed var2 ... );
int scanf( const char *format [,argument]... );
- 说明:从一个字符串中读进与指定格式相符的数据。 sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。 简单地说就是输入的类型不同。
- 用例说明:
string = "1.234 13";
double m;
long long e;
sscanf(s,"%lf %lld", &m, &e);//得到m=1.234和e=13
sscanf中间的fomat可以使用字符串匹配参考关于sscanf函数的各种详细用法
输出函数(sprintf, fprintf)
sprintf函数
- 调用格式:int sprintf( char *buffer, const char *format [, argument,…] );
- 说明:sprintf与printf函数的区别:二者功能相似,但是sprintf函数打印到字符串中,而printf函数打印输出到屏幕上。
sprintf函数在我们完成其他数据类型转换成字符串类型的操作中应用广泛。
- 用例说明:
//说明4:可以控制精度
char str[20];
double f=14.309948;
sprintf(str,"%6.2f",f);//str=" 14.31",6位,首部是空格。
//说明5:可以将多个数值数据连接起来。
char str[20];
int a=20984,b=48090;
sprintf(str,"%d %d",a,b);
str[]="20984 48090";
//说明6:可以将多个字符串连接成字符串
char str[20];
char s1[5]={'A','B','C'};
char s2[5]={'T','Y','x'};
sprintf(str,"%.3s%.3s",s1,s2);//str="ABCTYx"
//说明7:可以动态指定,需要截取的字符数
char s1[5]={'A','B','C'};
char s2[5]={'T','Y','x'};
sprintf(str,"%.*s%.*s",2,s1,3,s2);//str="ABTYx"
sprintf(s, "%*.*f", 10, 2, 3.1415926); //s=" 3.14",总共10位,小数位为2位
//说明8:可以打印出i的地址:sprintf(s, "%p", &i);相当于sprintf(s, "%0*x", 2 * sizeof(void *), &i);
//说明9:sprintf的返回值是字符数组中字符的个数,即字符串的长度,不用在调用strlen(s)求字符串的长度