【C】使用fgets和scanf分别从标准输入,对于‘\n‘和‘\0‘的处理

今天偶然使用了这两个函数,发现从标准输入的时候fgets与scanf存在差别

一、fgets输入数据小于字符数组长度

//输入小于数组长度

int main()
{
    char ch[10];
	fgets(ch, 10, stdin);

	for (int i = 0; i < 10;i++)
	{
		printf("%d ", ch[i]);
	}
}

//输入5698
//输出 53 54 57 56 10 0 -52 -52 -52 -52

由于fgets输入要求是字符串,所以输入转换成了ascii码,-52是随机数
53 -->  5
56 -->  6
57 -->  9
58 -->  8
10 --> '\n'
0  --> '\0'
由此可见fgets把输入的换行符号也存在了ch中

二、fgets输入数据大于等于字符数组长度

//输入大于数组长度

int main()
{
    char ch[10];
	fgets(ch, 10, stdin);

	for (int i = 0; i < 10;i++)
	{
		printf("%d ", ch[i]);
	}
}

//输入895247712263
//输出56 57 53 50 52 55 55 49 50 0

可以发现这串数据里面并没有ascii码为10的换行符号
char *fgets(char *Buf,int MaxCount,FILE *file),从文件中读取MaxCount-1个字符,第MaxCount字符将会填充’\0‘,。如果fgets()在读到字符上限之前已读完一整行,它会把表示行结尾的换行符放在空字符前面。fgets()函数在遇到EOF时将返回NULL值,可以利用这一机制检查是否到达文件结尾;如果未遇到EOF则返回之前传给它的第一个参数地址。

三、scanf输入数据小于字符数组长度

//输入小于数组长度

int main()
{
    char ch[10];
	scanf("%s",ch); 

	for (int i = 0; i < 10;i++)
	{
		printf("%d ", ch[i]);
	}
	return 0;
}

//输入5445
//输出53 52 52 53 0 -52 -52 -52 -52 -52
//这里将不会输出换行符

三、scanf输入数据大于或等于字符数组长度

//输入小于数组长度

int main()
{
    char ch[10];
	scanf("%s",ch); 

	for (int i = 0; i < 10;i++)
	{
		printf("%d ", ch[i]);
	}
	return 0;
}

//输入45664422114
//输出52 53 54 54 52 52 50 50 49 49
//这里将不会输出换行符

可以发现数组后面没有'\0',所以在输入超过数组最大长度的时候,要自己手动在最后一个字符处添'\0',其他多出来的数据都在缓冲区中,所以当下一行出现输入语句时,要先刷新缓冲区使用fflush(stdin);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值