今天偶然使用了这两个函数,发现从标准输入的时候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);