2015-04-09 3 views
0

У меня есть динамически выделяемый 2D массив строк, которые выглядят так:Получение столбцов из двумерного динамически распределенного массива?

2152,1,MAIN,AAST,2337,1,26873,LEC - Lecture,5,5,0,0,0,Ronnie W Liggett,[email protected],COBA,348,9:00 AM,9:50 AM,Y,N,Y,N,Y,N,N,1/20/2015,5/8/2015 
2152,1,MAIN,AAST,4391,1,26881,IND - Independent Study,1,5,4,0,0,Schnavia S Hatcher,[email protected],,,,,N,N,N,N,N,N,N,1/20/2015,5/8/2015 
2152,1,MAIN,AAST,3339,1,29501,LEC - Lecture,5,5,0,0,0,Krystal K Beamon,[email protected],UH,104,11:00 AM,12:20 PM,N,Y,N,Y,N,N,N,1/20/2015,5/8/2015 
2152,1,MAIN,ACCT,3309,6,27298,LEC - Lecture,59,59,0,0,0,Terra C Mcghee,[email protected],COBA,256,9:00 AM,11:50 AM,N,N,N,N,Y,N,N,1/20/2015,5/8/2015 

Все 1000 строк являются пузырьковой сортировки в алфавитном порядке по их предметам (это четвертый столбец, AAST и АККТ в приведенном выше примере). Мне нужно напечатать общую регистрацию для каждого предмета, которая является 9-м столбцом (5, 1, 5, 59 в этом примере). Код у меня ниже:

for(i=0;i<count;i++) 
    { 
      total = 0; 
      strcpy(currentLine, addresses[i]); 
      currentSubject = getSubject(currentLine); 
      for(i;i<count;i++) 
      { 
        printf("%d\n", i); 
        strcpy(nextLine, addresses[i]); 
        nextSubject = getSubject(nextLine); 
        if(strcmp(currentSubject, nextSubject) == 0) 
        { 
          strcpy(nextLine, addresses[i]); 
          enrollment = getEnrollment(nextLine); 
          total += enrollment; 
        } 
        else 
        { 
          printf("%s   %d\n", currentSubject, total);        
          break; 
        } 
      } 



    } 

где:

  • адреса является 2D массив, который содержит все 1000 строк
  • getSubject() извлекает четвертый столбец с помощью strtok()
  • getEnrollment() извлекает столбец регистрации с помощью strtok()
  • count равно количеству строк в файле, которое равно 999 (первая строка - это строка заголовка, которая не учитывается (

Я продолжаю использовать strcpy(), чтобы избежать повреждения исходной строки из-за strok(). Однако, эта логика, кажется, не работает, потому что мои итоги отображаются в виде:

AAST   11 
ACCT   193 
ADVT   12 

соответствующих строк (я удалил всю бесполезную информацию так, что легче читать) являются:

AAST,5 
AAST,1 
AAST,5 
ACCT,59 
ACCT,26 
ACCT,34 
ACCT,37 
ACCT,18 
ACCT,59 
ACCT,19 
ADVT,136 
ADVT,12 

Похоже, что для ACCT второе значение последнего (59) не добавилось, а также для ADVT, второе и последнее значение (136) также не добавилось. Что случилось с моей логикой?

+0

не используйте 'strtok'. Для 'getSubject()' и друзей это противоречит интуиции и ошибкам, чтобы изменить строковый аргумент. – chqrlie

ответ

1

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

Попробуйте это:

for (i = 0; i < count;) { 
    total = 0; 
    strcpy(currentLine, addresses[i]); 
    currentSubject = getSubject(currentLine); 
    for (; i < count; i++) { 
     strcpy(nextLine, addresses[i]); 
     nextSubject = getSubject(nextLine); 
     if (strcmp(currentSubject, nextSubject) != 0) 
      break; 
     strcpy(nextLine, addresses[i]); 
     total += getEnrollment(nextLine); 
    } 
    printf("%s   %d\n", currentSubject, total);        
} 
Смежные вопросы