c语言输入函数

c语言输入函数

1.scanf

头文件 stdio.h
d
int scanf(const char *format, …); // …表示多变量输入

例如:

int a;
scanf("%d",&a);//变量前要加上&符
char arr[10]={};
scanf("%s",arr);//字符数组就不需要 因为数组名代表首地址
scanf("%d %s",a,arr);

读取原理:
把读取的数据存入对应变量。它以空格、制表符、回车符为读取的结束符。

例如:

int a;
int b;
scanf("%d%d",&a,&b);//2 \n 3 3333  记得输出与输入对应
printf("%d %d\n",a,b);//2 3
2   
3 3333
2 3
//可见 读取两个数完毕后 遇到空格 会自动结束读值,然后把值赋给a和b

特例

   int a;
   int b;
   scanf("%d%d\n",&a,&b);
   printf("%d %d\n",a,b);

1 2
3
1 2
/*
当我输入 1  空格  2  回车 时,程序没有停止读值,
而是在等着 我的下一位输入,当我输入下个值时,才把 1 2 读进去
这是因为 1 空格 2 回车被\n吸收 此时缺少 结束符 当我们输入第三个数时 
3 回车 这个数后的回车没有给吸收当作结束符 读值结束。
(多个回车跟一个回车效果相同)
*/

缺点:
前面的scanf()在读取输入时会在缓冲区中留下一个字符’\n’(输入完按回车键所致),接下来的scanf()就不会等待从键盘键入字符,而是会直接取走这个“无用的”回车符,从而导致读取有误。
例如:

char arr[10];
scanf("%c",&arr[0]);   //d 回车
scanf("%c",&arr[1]);

输入为:

d  	我们可以通过再末尾吸收这个回车符来避免这种结果
  4     char arr[10];
  5     scanf("%c\n\n",&arr[0]);
  6     scanf("%c",&arr[1]);

输入:
d	回车 被\n吸收了 第6行的没有读取回车 等待下个结束符读取
f	回车

2.getchar()

字符输入函数 头文件 stdio.h

    int getchar(void);

读取一个字符,遇到回车 或者 EOF 停止读数

  4     char arr[10];
  5     arr[0]=getchar();
  6     printf("%c\n",arr[0]);

2dsad 回车
2

可用于清除缓冲区:

  4     char arr[10];
  5     scanf("%c",&arr[0]);
  6     scanf("%c",&arr[1]);
  7     getchar();
  8     printf("%c %c\n",arr[0],arr[1]);

s 回车
d 回车
s 

你会发现少了个输出,这是因为 第六行读取的是
回车 d其实是在第7输入的。

修正:

  4     char arr[10];
  5     scanf("%c",&arr[0]);
  6     getchar();
  7     scanf("%c",&arr[1]);
  8     printf("%c %c\n",arr[0],arr[1]);


d 回车
s 回车
d s  //是不是现在就正常了

3.gets()

gets从标准输入设备读字符串函数。可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保存储的空间足够大,以便在执行读操作时不发生溢出。此函数在stdio.h头文件中定义的。

   char *gets(char *s);
  4     char arr[10];
  5     gets(arr);
  6		printf("%s\n",arr);

sfsffadljsfjasdkjlajdfsajofjasodjofijosjodfsjsaofjasad
sfsffadljsfjasdkjlajdfsajofjasodjofijosjodfsjsaofjasad
*** stack smashing detected ***: a.out terminated
段错误 (核心已转储)
//必须人为控制输入长度 ,不然很容易出错 特别数跟数组这种内存固定

4.fgets()

   char *fgets(char *s, int size, FILE *stream);

参数:

     s: 字符型指针,指向存储读入数据的缓冲区的地址。

     n: 从流中读入n-1个字符

     stream : 指向读取的流。
  4     char arr[10];
  5     fgets(arr,10,stdin);
  6     printf("%s\n",arr);

sddsddsdssssssssdds
sddsddsds\0	
当输入少于10时:			
ddd    
ddd
回车   //当输入 少于10会读取回车 ddd\n\0 strlen(arr)=4
  6     int len=strlen(arr);
  7     printf("%d\n",len);
/*
	ddd
	4
*/
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值