При запуске программы появляются странные вещи - PullRequest
1 голос
/ 25 мая 2010

Я исправляю программу, но сталкиваюсь с проблемой и не могу понять, что не так в коде. Буду признателен за любую помощь. Я не опубликовал весь код, но я думаю, что с этой частью вы можете получить представление об этом. С помощью следующей функции enter () я хочу добавить данные пользовательских команд в список. например. пользователь дает команду: "en james bond 007 gun" ["en" означает "ввод" в командной строке]

«james» - это имя, «bond» - фамилия, 007 - сумма, а остальное - описание. Я использую strtok для «обрезания» команды, затем помещаю каждое имя во временный массив. Затем я вызываю InsertSort, чтобы поместить данные в связанный список, но в алфавитном порядке, в зависимости от фамилии, которую дают пользователи. Я хочу сохранить список в порядке и каждый раз размещать элементы в правильном положении.

Кроме того, возможно, имеется ошибка в InsertSort () и SortedInsert () ... поскольку данные не записываются в список, как следовало бы.

/* struct for all the data that user enters on file */
typedef struct catalog    
{
       char short_name[50];                    
       char surname[50];                       
       signed int amount;                      
       char description[1000];              

       struct catalog *next;

}catalog,*catalogPointer;   

catalogPointer current;
catalogPointer head = NULL; 

void enter(void)//user command: en <name> <surname> <amount> <description>
{ int n,j=2,k=0;
 char temp[1500];
    char command[1500];

 while (command[j]!=' ' && command[j]!='\0') 
 { temp[k]=command[j];    
  j++;      
  k++;      
 }
 temp[k]='\0';      

 char *curToken = strtok(temp," ");   
 printf("temp is:%s \n",temp);

 char short_name[50],surname[50],description[1000];
 signed int amount;
 //short_name=(char *)malloc(sizeof (char *));
 //surname=(char *)malloc(sizeof (char *));
 //description=(char *)malloc(sizeof (char *));
 //amount=(int *)malloc(sizeof (int *));
 printf("\nWhat you entered for saving:\n");
 for (n = 0; curToken !='\0'; ++n)   
 { 
  if (curToken)
  { 
    strncpy(short_name, curToken, sizeof (char *)); /
  } 
  printf("Short Name: %s \n",short_name);    

  curToken = strtok(NULL," ");      
  if (curToken)
     strncpy(surname, curToken, sizeof (char *)); /
  printf("SurName: %s \n",surname);

  curToken = strtok(NULL," ");      
  if (curToken)
  {
     char *chk;     
     amount = (int) strtol(curToken, &chk, 10); 
    if (!isspace(*chk) && *chk != 0)
                    fprintf(stderr,"Warning: expected integer value for amount, received %s instead\n",curToken);
  }
  printf("Amount: %d \n",amount);
  curToken = strtok(NULL,"\0");     
  if (curToken)
    { strncpy(description, curToken, sizeof (char *));   
  }
  printf("Description: %s \n",description);
  break;
 }

 if (findEntryExists(head, surname) != NULL)
  printf("\nAn entry for <%s %s> is already in the catalog!\nNew entry not entered.\n",short_name,surname);
 else
 {
  printf("\nTry to entry <%s %s %d %s> in the catalog list!\n",short_name,surname,amount,description);
  InsertSort(&head,short_name, surname, amount, description);
  printf("\n**Entry done!**\n");
 }
 // Maintain the list in alphabetical order by surname.


}


/********Uses special case code for the head end********/
void SortedInsert(catalog** headRef, catalogPointer newNode,char short_name[],char surname[],signed int amount,char description[])
{
 strcpy(newNode->short_name, short_name);   
 strcpy(newNode->surname, surname);
 newNode->amount=amount;
 strcpy(newNode->description, description);

 // Special case for the head end
 if (*headRef == NULL||(*headRef)->surname >= newNode->surname)  
 {  newNode->next = *headRef;    
        *headRef = newNode;     
    }
    else 
 {       // Locate the node before the point of insertion
       catalogPointer current = *headRef;   
  catalogPointer temp=current->next;  
       while ( temp!=NULL )  
  {  
       if(strcmp(temp->surname,newNode->surname)<0 ) 
               current = temp; 
       }
       newNode->next = temp;    
       temp = newNode;    
    }
}


// Given a list, change it to be in sorted order (using SortedInsert()).
void InsertSort(catalog** headRef,char short_name[],char surname[],signed int amount,char description[])
{
 catalogPointer result = NULL;         // build the answer here
    catalogPointer current = *headRef;   // iterate over the original list
    catalogPointer next;     
    while (current!=NULL) 
 {
      next = current->next;    // tricky - note the next pointer before we change it
      SortedInsert(&result,current,short_name,surname,amount,description);
      current = next;
    } 
    *headRef = result;
}

Запустив программу, я получаю эти странные вещи (мусор?) ...

Выберите ваш выбор:

en Джеймс Бонд 007 пистолет

Ваша команда: en james bond 007 gun

температура: Джеймс

То, что вы ввели для сохранения: Short

Имя: Джеймс
ФАМИЛИЯ:
Сумма: 0

Описание: 0T Г

Попробуйте ввести james 0 0T Г в поле список по каталогу!

Запись сделана!

Также у меня возникла проблема с использованием 'malloc' в этой программе.

Заранее спасибо. , ,

UPDATE: Я сделал другую функцию для входа. Но как-то странно, я получаю сегментации для strcpy! Вот и все:

catalogPointer newEntry (char short_name[], char surname[], signed int amount, char description[])
{ 
 catalogPointer newNode,first,second,tmp;
 first=head;
 second=NULL;
 strcpy(newNode->short_name, short_name); //SEGMENTATION
    strcpy(newNode->surname, surname);
    newNode->amount=amount;
    strcpy(newNode->description, description);

 while (first!=NULL)      
 {     if (strcmp(surname,first->surname)>0)
   second=first;
  else if (strcmp(surname,first->surname)==0)
       {
      if (strcmp(short_name,first->short_name)>0)
   second=first;
  }
  first=first->next;
 }
 if (second==NULL)
 {     newNode->next=head;
  head=newNode;
 }
 else
 {      tmp=second->next;
           newNode->next=tmp;
           first->next=newNode;
 }

}

Ответы [ 2 ]

3 голосов
/ 25 мая 2010

Решение

Прямая причина вашей проблемы здесь:

while (command[j]!=' ' && command[j]!='\0') 
 { temp[k]=command[j];    
  j++;      
  k++;      
 }

То, что вы здесь делаете, копирует содержимое command в temp до первого пробела . То есть вы копируете только "james". Таким образом, после короткого имени strtok больше ничего не нужно анализировать, поэтому другие буферы не инициализируются должным образом и содержат только мусор.

Обновление: Для копирования содержимого после первого пробела , используйте strchr и strcpy вместо этого цикла :

char* params = strchr(command, ' ') + 1;
strcpy(temp, params);

Другие наблюдения

Кроме того, здесь вы неправильно указали размер буфера назначения:

strncpy(surname, curToken, sizeof (char *));

должно быть

strncpy(surname, curToken, 49);

Во-вторых: выражение цикла в

for (n = 0; curToken !='\0'; ++n)   

должно быть

for (n = 0; curToken; ++n)   

в противном случае цикл не завершится правильно, когда будут проанализированы все токены.

2 голосов
/ 25 мая 2010

Похоже, вы не заполняете command чем-либо, поэтому вы разбиваете токены на мусор в стеке.

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