输入输出的注意事项


   

首先说说C特殊的输入输出格式:

输入:

1. scanf可以滤去一些不想要的东西。

举例说明如下:

比如:

输入:a = 1,b = 2;

scanf(“a = %d,b = %d”, &a, &b);

再比如:
scanf("%d %*d %d",&a, &b);

输入1 2 3回车(系统将1赋予m,3赋予n,因为*号为忽略输入修饰符,表示跳过它相应的数据所以2不赋予任何变量)


2.
 字符串输入

getchar(), scanf(“%c”); scanf(“%s”), gets()区别

其中getchar()  scanf(“%c”)的功能是一样的。
这两个函数读入的是输入流中当前位置的字符,比如:
scanf(“%d”,&n);
c = getchar();
假设输入 67/ (假设“/”代表回车),则第一个scanf读入一个整数67后,当前输入流的位置是67之后,即指向回车符,所以第二个getchar()读入的就是一个回车符了,即 c = ‘\n’

同样,gets()也是从当前位置读入一行字符串。
比如:
scanf(“%d”,&n);
gets(str);
此时读入字符数组中的字符串就是“\n” 
所以通常在用scanf读入一个非字符串的类型之后,如果要读入字符,或字符数组,都用一个额外的getchar()把回车符读掉,若后面跟的不止一个回车符,可能还有多余的空格的话,就用gets()读掉。

和以上不同的是,scanf(“%s”) 读入的时候是会忽略掉空格,回车和制表符的并且以空格,回车和制表符作为字符串结束的标志。

也就是说,scanf"%s")其实是比较特殊的,它一定会等到所有空白符结束,一直等到它要等的字符串出现,它才读取,在字符串出现之前,出现的所有空白符都会忽略掉。

经常会有这样的题,输入第一行是一个整数,接下来每行的第一个是一个字符,用来表示某种操作,后面再跟一些数据,比如:
4
A 100 2
B 23
A 23 89
B 34
像这种输入就需要小心,读入字符时不要读成回车符。
为了防止意外,我一般是这样处理这类输入的:
char model[2];
Scanf(“%d”,&n);
for(…,…,…)

{
scanf(“%s”,model);
if(model[0] == ‘A’){}
else{}
}

输出:

1.一些特殊字符的输出:
单引号,双引号,和反斜杠的输出在前面加转义字符”\”
如:
”\’” , “\”” , “\\”
%
的输出用两个连在一起的%%,即
printf(“%%”);
2. double
 应该用%lf来输入和输出,否则错误!

3. 64位整数的输入输出,

64位整数是:
__int64
 (注意int前面是两个下划线)
输入输出格式为“%I64d”.

4.long long应该用"%lld"输入输出。
5.
 正负号 
-
 结果左对齐,右边填空格
 
+
 输出符号空格输出值为正时冠以空格,为负时冠以负号
6.
 输出宽度和小数点后的位数(或字符串截取长度)

%5.3lf

表示右对齐,5为格式宽度,3为保留小数点后3位(四舍五入)

%-7.2s

表示左对齐,7为格式宽度,2为截取字符串中前2个字符。

7.%g的使用,%g是自动选择%f%e中的一种,根据输出的长短选择短的那个,有一个关键的应用是,%g在输出时会自动删去double后面多余的0,这个应用比较广泛。

很重要的一点:千万不要把coutprintf混用,因为cout是带缓冲的而printf不带,所以会使得输出的数据顺序混乱。

 

当代32PC上空间最大限制一般是10^7Byte10MB,比如你可以开几个大小为10^6的整型数组: int A[10^6]; 开更大的数组,比如A[10^7]一般会遇到Memory Limit Exceed; 即使不超内存根据前面的运算次数限制可知时间复杂度也不会。

 

%d %lld %lf自动扫描前导空格

 

 

 读一个非空白字符,方法一

char str[2];

scanf(%1s”, str);

// %s扫描前导空白,并且只读一个字符

char c = str[0];

 方法二

 强制扫描空白

 %前面加上一个空格表示强制扫描前导空白

 scanf( %c, &ch);

 前面那个读人物信息的完整scanf语句:

 scanf(%s %c %s, name, &gender, ability);

 同理,格式后面加一空格表示读完这个变量后扫描空白,注意空白是包括回车的

 读一行:gets, fgets

 gets会导致很讨厌的warning message,所以可改用fgets

 fgets(str, sizeof str, stdin) = gets(str)

 注意应使下一个字符处于这一行开头

 n个整数在一行上,但是n不知,只知道整数是空格分开的,怎么读?

 getchar+ungetc扫描?麻烦!

 介绍一个函数:strtok

 strtok示例

 5 38 29 38 28 58 82 58

char str[100];

char *input = str, *token;

gets(str);

while ( (token = strtok(input,  )) != NULL ) {

input = NULL;

int number = atoi(token);

// 处理number

}

 也可用istringstream处理

istringstream in(str);

while ( in >> k ) {

// 处理k

}

 

 

 

 

 

 

再讲C++I/O

1.cin>> cout<< 当输入数据量特别大时建议使用scanf ,效率会大大提升。

2.输入含空格等的字符串时,可以使用:

cin.getline(str) 或者

getline(cin,str)

未提示输入结束标记时 

while(cin.getline(str)) 或者while(getline(cin,str))

3.无论用cin还是scanf ,读入字符之后若要再继续读入,应消去换行符,可使用scanf("%*c")或者getchar().

待续

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值