while函数中的getchar()函数出现新问题,请教!

时间:2021-10-07 23:14:55
各位前辈你们好,小弟有一棘手难题相求,请看代码:

.......
ds *get_input()
{
  int n = 0;
  int flag = 0;
  char p1,q1;
  ds *a;
  a = (ds *)malloc(sizeof(a));
  do
  {
    
    p1 = getchar();
    fflush(stdin);
    if((p1=='X')||(p1=='x'))
    {
      flag = 1;
      break;
    }

    q1 = getchar();
    fflush(stdin);
    if((q1=='X')||(q1=='x'))
    {
      flag = 1;
      break;
    }

    a[n].p = atoi(&p1);
    a[n].q = atoi(&q1);

    n++;
  } while(flag == 0);
  return a;
};
.......

其中a为指向结构数组的指针,定义如下:
struct 
{
  int p;
  int q
} *a;

本人想让每次输入的数分别放入一个结构数组中的p,q里去,但问题出在:在程序运行时,当输入到第15个数的时候,程序就报错,错误代码:

QUICK 在 017f:004012c5 的模块
 QUICK.EXE 中导致无效页错误。
Registers:
EAX=00000000 CS=017f EIP=004012c5 EFLGS=00010216
EBX=00550000 SS=0187 ESP=0065fd30 EBP=0065fd9c
ECX=00000e28 DS=0187 ESI=8183e554 FS=3607
EDX=00780ec0 ES=0187 EDI=0065fd9c GS=0000
Bytes at CS:EIP:
89 04 ca 8d 45 ec 50 e8 6f 02 00 00 83 c4 04 8b 
Stack dump:
0065fdf8 8183e554 00550000 cccccccc cccccccc cccccccc cccccccc cccccccc cccccccc cccccccc cccccccc cccccccc cccccccc cccccccc cccccccc cccccccc 

程序调试时,在输入到第15个数的时候,getchar()函数就不执行了,不知是为何,只好请教各位前辈了。

5 个解决方案

#1


把a = (ds *)malloc(sizeof(a))改成:

a = (ds *)malloc(sizeof(a)*20);

你分配的空间不够多。上面的语句是分配可以存储20个节点的空间。

#2


a = (ds *) malloc(sizeof(*a) * 20);
                       ^^^
应该是这样才对
你分配的空间太少,造成的错误

#3


a = (ds *) malloc(sizeof(ds) * 20);
                       
你的代码很不归整,可能搞死程序的地方太多,内存未释放,大忌。
就算你在其他函数释放,该函数也就毫无独立性。
建议:在调用函数前申请a的内存,同时将a的边界作为参数输入。
a完全可以用数组实现,如果a的数量不大(例如1000以下),不需要在堆上分配内存。

int get_input(ds* a, int num)
{
  int n = 0;
  char p1,q1;

  if(a==NULL)
     return -1;

  memset(a, 0, sizeof(ds)*num);

  while(n<num)
  {
    p1 = getchar();
    fflush(stdin);
    if((p1=='X')||(p1=='x'))
      break;
    if(isdigit(p1))
       a[n].p = p1-0x30;

    q1 = getchar();
    fflush(stdin);
    if((q1=='X')||(q1=='x'))
      break;
    if(isdigit(q1))
       a[n].q = q1-0x30;

    n++;
  };

  return 0;
};

#4


感谢网友xuying(),Maxwell(不可知)和ryan_chen(陈磊)的友情帮助,已加分!

#5


感谢网友xuying(),Maxwell(不可知)和ryan_chen(陈磊)的友情帮助,已加分!

#1


把a = (ds *)malloc(sizeof(a))改成:

a = (ds *)malloc(sizeof(a)*20);

你分配的空间不够多。上面的语句是分配可以存储20个节点的空间。

#2


a = (ds *) malloc(sizeof(*a) * 20);
                       ^^^
应该是这样才对
你分配的空间太少,造成的错误

#3


a = (ds *) malloc(sizeof(ds) * 20);
                       
你的代码很不归整,可能搞死程序的地方太多,内存未释放,大忌。
就算你在其他函数释放,该函数也就毫无独立性。
建议:在调用函数前申请a的内存,同时将a的边界作为参数输入。
a完全可以用数组实现,如果a的数量不大(例如1000以下),不需要在堆上分配内存。

int get_input(ds* a, int num)
{
  int n = 0;
  char p1,q1;

  if(a==NULL)
     return -1;

  memset(a, 0, sizeof(ds)*num);

  while(n<num)
  {
    p1 = getchar();
    fflush(stdin);
    if((p1=='X')||(p1=='x'))
      break;
    if(isdigit(p1))
       a[n].p = p1-0x30;

    q1 = getchar();
    fflush(stdin);
    if((q1=='X')||(q1=='x'))
      break;
    if(isdigit(q1))
       a[n].q = q1-0x30;

    n++;
  };

  return 0;
};

#4


感谢网友xuying(),Maxwell(不可知)和ryan_chen(陈磊)的友情帮助,已加分!

#5


感谢网友xuying(),Maxwell(不可知)和ryan_chen(陈磊)的友情帮助,已加分!