2015-03-10 4 views
0

С помощью C у меня есть массив строк, некоторые из них дубликаты. Я пытаюсь подсчитать количество уникальных строк. Код:C, подсчет уникальных строк в массиве строк

for(i=0; i<size; i++){ 
     flag=0; 
     if(strcmp(" ", tArr[i])!=0){ 
      for(j=i; j<size; j++){ 
       if(strcmp(tArr[i], tArr[j])==0){ 
        if (flag<1){ 
         flag=1; 
         k++; 
        } 
        strcpy(tArr[j], " "); 
       } 
      } 
     } 
    } 
  1. Первый цикл проходит через весь массив
  2. Установить флаг в ноль для каждой итерации
  3. Использование заготовок в качестве другого флага, если индекс является пустым, это означает, что слово имеет уже подсчитано, перейти к следующему индексу
  4. Сравните этот показатель для каждого индекса после него, таким образом, у = я
  5. Если вторичный индекс совпадает с первым
  6. I е это слово еще не было найден
  7. Trigger флага
  8. Добавить к, подсчитывать уникальное слово
  9. Установите весь оставшийся экземпляр этого слова в пустое пространство, чтобы соответствовать линии 3

    Вместо от установки k до уникального количества слов, он устанавливается на общее количество слов. Используя напечатанные флаги, я смог сказать, что функция проделает весь путь, даже после строки

  10. Я до сих пор не могу сказать, как она делает это на линии 8 на каждой итерации самого внешнего цикла.

+1

Внутренний цикл должен быть 'for (j = i + 1; j Segmented

+0

Подумайте, что исправил его, спасибо. – thingy

ответ

3

Адаптация кода, попробовать что-то вроде этого:

for (i = 0; i < size; i++) { 
    for (j = i + 1; j < size; j++) 
     if (strcmp(tArr[i], tArr[j]) == 0) 
      break; 
    if (j == size) 
     unique_count++; 
} 

Там не должно быть никакой необходимости уничтожить дубликаты, если вы только подсчет, однако, если вы все еще хотите, чтобы сделать это, я хотел бы предложить пустая строка, а не одна, содержащая пробел.

+0

@iharob Хотя я ценю редактирование, я не думаю, что для стилистических изменений требуется код, особенно когда он адаптировал исходный код из OP. Откат. – Segmented

+1

@iharob Style очень субъективен, я бы никогда не зашел так далеко, чтобы отредактировать стиль someones в должности так же, как я не был бы на рабочем месте - на самом деле на рабочем месте нужно оставаться в соответствии с остальной частью проекта, независимо от собственных стилистические предпочтения. Пусть * это * отражает то, как я забочусь о безопасности и качестве. – Segmented

+1

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

Смежные вопросы