源代码如下:
/*输入一个整型数,然后申请对应大小空间内存,然后读取一个字符串,
字符串的输入长度小于最初输入的整型数大小,最后输出输入的字符串即可(无需考虑输入的字符串过长,超过了内存大小);
*/
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a;
scanf("%d",&a);//地址大小
char *p;
p=(char *)malloc(sizeof(a));//开输入字符串的空间
gets(p);//输入
puts(p);//输出
free(p);
return 0;
}
只输出空行,后来经过更改,只加了两行代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a;
scanf("%d",&a);
//就是这两句 读取一个字节 按讲授来说应该是'\n'
char c;
scanf("%c",&c);
char *p;
p=(char *)malloc(sizeof(a));
gets(p);
puts(p);
free(p);
return 0;
}
为什么会出现这个问题??查阅资料后发现是缓存区的问题,第一次写的将‘\n’写入了p中。
什么是输入输出的缓存区?
C语言的标准输入输出是分缓冲和无缓冲的。缓冲分为全缓冲和行缓冲: 全缓冲:当缓冲区满了在进行I/O读写。一般磁盘文件是全缓冲; 行缓冲:遇到换行符后进行I/O操作,当然缓冲区满了也要进行操作。注意:换行符也被读入缓冲区。
所以在上面的过程中‘\n’就被写到了里面 但是如果后面输入的是整型就不会 因为整型不会读取‘\n’。
关于scanf缓冲区:(21条消息) scanf的缓冲区问题scanf缓冲区龙跃十二的博客-CSDN博客