2013-09-24 4 views
1

Для данного массива, мне нужно написать функцию сортировки слов по алфавиту:Сортировка слов в массиве символов

char strings [][10] = { 
    "hello", 
    "world", 
    "computers", 
    "are", 
    "awesome" 
}; 

Я попытался написать функцию sortWords с помощью вставки рода, но я думаю, что мой функция подкачки не работает:

void swap(char *e1, char *e2) { 
    int tmp = *e1; 
    *e1 = *e2; 
    *e2 = tmp; 
} 

void sortWords(char (* words2Darray)[10], unsigned short length) { 
    unsigned int i, curPos; 
    char curChars[10]; 

    for(i = 1; i < length; i++) { 
     // Copy the current word into curChars 
     strncpy_s(curChars, words2Darray[i], 10); 
     curPos = i; 

     // Compare and move the word to the correct position 
     while(curPos > 0 && strcmp(curChars, words2Darray[i-1]) > 0) { 
      swap(words2Darray[curPos], words2Darray[curPos-1]); 
      curPos--; 
     } 
    } 
} 

Я попытался отладки моего кода с помощью локального Windows, отладчик и обнаружил, что curChars копируются правильно.

Может кто-то пожалуйста объяснить мне, что я делаю неправильно и как я должен решить эту проблему? Мне не разрешено использовать std::string в этой проблеме. Никаких полных решений, пожалуйста!

+0

Я заметил, что ваше предложение «Мне не разрешено использовать std :: string в этой проблеме» всего несколько минут назад. Изменили мой ответ. Cheers – sehe

ответ

2

Y ожно использовать только std::sort:

std::sort(std::begin(strings), std::end(strings), cmp); 

Это требует компаратора. Я взбила один на основе strcmp.

Смотреть это Live on IdeOne

#include <algorithm> 
#include <iostream> 
#include <cstring> 

int main() 
{ 
    char const* strings[] = { 
     "hello", 
     "world", 
     "computers", 
     "are", 
     "awesome" 
    }; 

    struct { 
     bool operator()(char const* a, char const* b) const { 
      return (a && b)? 0 > strcmp(a,b) : a < b; 
     } 
    } cmp; 

    std::sort(std::begin(strings), std::end(strings), cmp); 

    for (auto& s : strings) 
     std::cout << s << "\n"; 
} 

Обратите внимание, что я взял на себя смелость сделать элементы массива char* вместо char[]. Это по причинам, указанным Карлом Норумом.

+0

Код на C++ может быть коварным. Сравнение std :: less преобразует оба аргумента char * в строки, сравнивает их, а затем отбрасывает строки. Это отличный пример небольшой строки кода, которая имеет более высокие, чем ожидалось, последствия для производительности. –

+1

@ ZanLynx Верно это. Я написал последнюю строку по какой-то причине. Я не собираюсь рекомендовать специализированный компаратор для 'char (&) []' только для добавления того, что swap также должен быть предоставлен. В случае, если ОП требует непрерывного хранения, я собираюсь предположить, что он/она сначала займется этими аспектами C++. *** Профилирование перед всем *** – sehe

+0

Я был в основном умным, чтобы быть ленивый эффективен. Бывают ситуации, когда вам нужно больше производительности.Мои 10 баксов говорят, что это не такая ситуация :) – sehe

1

Вы не меняете строки, вы меняете первые символы строк. Если вы хотите передать по значению, вам нужно что-то вроде:

void swap(char **e1, char **e2) { 
    char *tmp = *e1; 
    *e1 = *e2; 
    *e2 = tmp; 
} 

, а затем использовать его:

swap(&words2Darray[curPos], &words2Darray[curPos-1]); 

В качестве альтернативы вы можете оставить swap вызов, как есть и использовать ссылки:

void swap(char *&e1, char *&e2) { 
    char *tmp = e1; 
    e1 = e2; 
    e2 = tmp; 
} 

(я думаю, что это правильно - мой C++ ржавый я сделать тест, чтобы убедиться..)

+0

Программа не будет компилироваться сейчас: 'Ошибка C2664: 'swap': невозможно преобразовать параметр 1 из 'char [10]' в 'char * &'' –

+0

Да, у вас есть и другие ошибки. Передача указателей на массивы вокруг довольно странно. –

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