Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2009, 12:03   #1
burzum
Новичок
Джуниор
 
Регистрация: 20.07.2009
Сообщений: 2
Смущение qsort и структуры

Пишу программу на Си не С++ для подсчета количества повторяемых слов в произвольном тексте
Код:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <ctype.h>

#define LONG 30

typedef struct addr {
           int k;
           char value[LONG];
           } addr;

void str_mas(int len, int SIZE, FILE *che);
int sorting(const void* a, const void* b);

int main(void)
{   
    FILE *in, *out;
    fpos_t file_loc;
    char ch, och, *p, ch1, cha = '.', chs = ' ', ch_ar, *line;
    int k=0, SIZE, i=0;
      
    do {
        fgetpos(in, &file_loc);
        ch = fgetc(in);         
    } while (!isalnum(ch));
    
    fsetpos(in, &file_loc);
    
    while(!feof(in)) {
                     ch = tolower(fgetc(in));
                     
                     if ((ch == '\n') && (ch_ar != ' ')) {
                            fputc(chs, out);
                            ch_ar = chs;
                            continue;
                     }
                     
                     if ((ch == '\t') && (ch_ar != ' ')) {
                            fputc(chs, out);
                            ch_ar = chs;
                            continue;                          
                     }
                     
                     if ((ch == '"') && (ch_ar != ' ')) {
                            fputc(chs, out);
                            ch_ar = chs;
                            continue;
                     }
                     
                     if(!feof(in) && (isalnum(ch) || (ch ==' ') || (ch 
                     == '-') || (ch =='\n') || (ch =='\t') || (ch =='/' ) 
                     || (ch == '"') || (ch == '%') || (ch == '\\') || (ch == '_') || (ch == '+'))) {
  
                                if ((ch == ' ') && (ch_ar == ' ')) continue;
                                
                                if ((ch == '\n') && (ch_ar == ' ')) continue;
                                if ((ch == ' ') && (ch_ar == '\n')) continue;
                                
                                if ((ch == '\t') && (ch_ar == ' ')) continue;
                                if ((ch == ' ') && (ch_ar == '\t')) continue;
                                
                                if ((ch == '"') && (ch_ar == ' ')) continue;
                                if ((ch == ' ') && (ch_ar == '"')) continue;
                                
                                fputc(ch, out);
                                ch_ar = ch;
                                printf("ffi %c \n", ch);
                                }                    
    }
    
    fputc(cha, out);
    rewind(out);
    
    ch = fgetc(out);
    
    while(!feof(out)) {
                     k++;
                     ch = fgetc(out);
    }
    
    k++;
      
    rewind(out);
    
    while(!feof(out)) {
                     ch = fgetc(out);
                     if (ch == ' ') i++;
                     if ((ch == '.') && (ch_ar == ' ')) {
                             i--;
                             break;
                     }
                     ch_ar = ch; 
    }
                                            
     SIZE = ++i;
     
     printf("SIZE = %d\n", SIZE);            
        
     str_mas(k, SIZE, out);
     fsetpos(out, &file_loc);
    
     ch = fgetc(out);    

    
    
    
    fclose(in);
    fclose(out);
    system("pause");
    
    return 0;
}



void str_mas(int len, int SIZE, FILE *che)
{
    
    int l=1;
    int i, j;
    char ch_ar[LONG], str[len], s_mas[SIZE][LONG];
    char* pstr;
    char* find = " ";
    fpos_t loc;
           
    addr *addr_list;
    
              
    rewind(che);
        
    fgets(str, len, che);
    
    pstr = strtok(str, find);
    strcpy(s_mas[0], pstr);
 
    for (i=1; i<SIZE; i++) {
                 pstr = strtok('\0', " ");
                 strcpy(s_mas[i], pstr);
              }
              
    for (i=0; i<SIZE; i++)         printf("this - %s\n", s_mas[i]);
    printf("\n");

    
    for (i=0; i<SIZE; i++) {
       addr_list[i].k = 0;
        
        strcpy(addr_list[i].value, s_mas[i]);
                      for (j=0; j<SIZE; j++) {
                          if (!strcmp((addr_list[i].value), s_mas[j])) addr_list[i].k++;
                          
        }
    }   
    qsort(addr_list, SIZE, sizeof *addr_list, sorting);
    
    for (i=0; i<SIZE; i++) printf("sorting %s %d\n", addr_list[i].value, addr_list[i].k);
    
}    
    
int sorting(const void* i, const void* j)
{
        return (*(int *)i - *(int *)j);
}
Проблема возникла в сортировки структур с помощью qsort, тоесть оно вроде и сортирует, но выводит какой-то бред и потом выбивает ошибка.
Помогите пожалуйста, хочу разобраться в чем проблема.
burzum вне форума Ответить с цитированием
Старый 26.11.2009, 13:23   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

1. почему в sorting идёт приведение к int, а не к типу структуры addr?
2. qsort(addr_list, SIZE, sizeof *addr_list, sorting);
что такое sizeof *addr_list? Там разве не sizeof(addr) передавать нужно?
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Структуры Wertex Помощь студентам 3 30.10.2009 13:52
Функция qsort() phpcreator Общие вопросы C/C++ 1 19.10.2009 22:34
Структуры в СИ ManInBlack Помощь студентам 3 04.04.2009 19:08
Структуры Centyrion Общие вопросы C/C++ 4 06.05.2008 20:33
Структуры в С++ bloo[d] Помощь студентам 1 30.01.2008 22:27