线性表scanf直接被跳过

^z之后scanf不被执行直接跳过是怎么回事

img

#include
#define MaxSize 105
typedef int ElemType;//顺序表元素类型是整数 
typedef struct{
   ElemType a[MaxSize];//顺序表的元素 

   int n;//顺序表的长度 
}SeqList;
//0.输出函数
void print(SeqList sq);
//1.创建顺序表sq,写操作要用指针 
void create(SeqList *sq); 
//2.在顺序表sq第i个位置插入item 
int insert (SeqList *sq,int i,ElemType item);
int main(){
    int p,x;
    SeqList sq;
    sq.n=0;         
    printf("1.创建顺序表\n");
    
    create(&sq);
    
    print(sq);

    printf("2.顺序表的插入操作:\n");
    
    scanf("%d %d",&p,&x);
    printf("%d %d",p,x); 
   
if(insert(&sq,p,x) == -1)    {
    printf("插入失败\n"); 
}
else print (sq);
    return 0;
}
void print(SeqList sq)
{int i;
  printf("顺序表的长度是: %d\n",sq.n);
  for( i = 0;i < sq.n; i++){
  printf("%d ",sq.a[i]);
}
  printf("\n");
}
void create(SeqList *sq)
{
    int n = 0,x;
    while(scanf("%d",&x) == 1){
    sq->a[n] = x;
    n++;
}
sq->n = n;
}
int insert (SeqList *sq,int i,ElemType item)
{  if(sq->n == MaxSize || i<1 || i > sq->n+1)
{
    return -1;
}int j;
  //1.[i - 1,n - 1] 的元素从后往前依次后移一个位置
  for( j = sq->n - 1;j >= i - 1;j--){
   sq->a[j + 1] = sq->a[j];
  }
  //2.插入元素item到i-1
  sq->a[i-1] = item;
    // 3.修改表的长度 
(sq->n)++;
return 1;
}

你输入了^Z之后,因为scanf的参数是%d,所以并不会把它取走,而是遗留在缓冲区里
你要再次读入数据之前,应该先用getchar之类的命令把它取走,否则你后续的scanf依然取到的是^Z