вход в C-программу - PullRequest
       1

вход в C-программу

0 голосов
/ 23 июня 2011

Я написал программу для генерации одночленов и полиномов, а также для печати одночленов и полиномов. Данные вводятся с клавиатуры. Например, сначала введите количество групп данных 3, затем введите данные: 1,3,2,4,3,6,3,4,2 (каждая группа имеет 3 элемента). Мне нужен выходной моном Y ^ {1} {2,3} Y ^ {4} {3,6} Y ^ {3} _ {4,2}. Моя программа может работать. Но вывод не правильный. Я думаю, что проблема программы заключается в следующей части. Я думаю, что scanf не хорош в следующем. Есть ли другой лучший способ ввода, чтобы решить эту проблему? Вся программа в http://hi.baidu.com/lijr03/blog/item/51e17b0c63614bc863d98629.html

monomial create_monomial(int number) /* create a monomial */
{

   monomial m,s;
   monomial p;
   int i;


   printf("Please input the parameters (for example,  2, 2, 3 denotes the monomial P^{2}_{2,3}). The first subscripts i's of P's should be in increase order.");
   m=(monomial)malloc(sizeof(monomial_node));
   m->head=m->tail=(monomial)malloc(sizeof(monomial_node));

   if(m->head==NULL)
   {
     return NULL;
   }

   m->head->next=m->tail;

   m->tail->next=NULL;

   p=(monomial)malloc(sizeof(monomial_node));

   m->head->next=p;

   p->next=m->tail;   

   scanf("%d", &((p->y).l)); 
   scanf("%d", &((p->y).i));
   scanf("%d", &((p->y).k));

  if(number > 1)
  {
   for(i=0;i<number-1;i++)

   {

    s=(monomial)malloc(sizeof(monomial_node));

    scanf("%d", &((s->y).l)); 
    scanf("%d", &((s->y).i));
    scanf("%d", &((s->y).k));

    s->next=p->next;     /* insert the node a */

    p->next=s;

    free(s);            

   }
  }
   return m;
}

Ответы [ 3 ]

3 голосов
/ 23 июня 2011

free(s) означает, что вы уничтожаете только что созданный моном. Указатель, который вы создаете над ним (от p), означает, что вы будете указывать на потенциально недопустимый бит памяти при обработке m.

1 голос
/ 23 июня 2011

scanf - хороший выбор, но он может быть немного странным.Я думаю, что в этом случае вам нужен формат scanf, такой как "% d,% d,% d".Однако лучше всего написать небольшую простую C-программу, которая просто вводит данные и экспериментирует с этим.Это выглядело бы примерно так:

 int main(){
     int x, y, z ;

     scanf("%d,%d,%d", &x, &y, &z);
     printf("%d,%d,%d\n", x,y,z);
     return 0;
 }

Как только вы это заработаете, заставить настоящую программу работать должно быть просто.

0 голосов
/ 23 июня 2011

Поскольку вы еще не показали, что является ошибочным выводом, я могу только сделать обоснованное предположение о том, в чем конкретно может быть проблема, но в дополнение к неправильным вызовам scanf() и вызову free, который удаляетдополнительные выделенные узлы в вашем списке, у вас есть «пустые» узлы для head и tail.Поэтому, когда вы просматриваете свой связанный список, вам нужно будет принять во внимание, что узлы head и tail пусты, в противном случае вы получите нечетные значения для этих узлов, поскольку они неинициализированы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...