C или C ++. Как сравнить две строки с указанными символами *? - PullRequest
9 голосов
/ 25 февраля 2010

Я сортирую свой массив автомобилей двумя способами. один за годом, который показан ниже. и еще один по марке. Make - это char * Как мне сравнивать строки, когда у меня есть только указатели на них?

int i, j;
for(i=0; i<100; i++){
    for(j=0; j<100-i; j++){
        if(carArray[i]!=NULL && carArray[j]!= NULL && carArray[j+1]!=NULL){
            if(carArray[i]->year > carArray[j+1]->year){
                swap(carArray[j], carArray[j+1]);
            }
        }
    }
}

Вышеуказанный метод работает для целых (год). Как я могу заставить его работать для указателей на символы?

Ответы [ 8 ]

29 голосов
/ 25 февраля 2010

В любом случае, способ - позвонить strcmp. Если ваши строки (по какой-то странной причине) не заканчиваются NUL, вы должны использовать strncmp.

Однако в C ++ вам действительно не следует манипулировать строками в массивах символов, если вы можете разумно избежать этого. Вместо этого используйте std::string.

13 голосов
/ 25 февраля 2010

Я думаю, вам нужно использовать функцию strcmp ().

2 голосов
/ 25 февраля 2010

Убедитесь, что char * не равен нулю, и, если хотите, поищите функцию stricmp () для сравнения без учета регистра. В противном случае используйте strcmp ().

char * фактически представляет адрес памяти первого символа в каждой строке. Таким образом, вы не хотите сравнивать значения указателей, а содержимое, на которое они указывают.

1 голос
/ 25 февраля 2010

В C его функция strcmp () уже указана. В C ++ вы можете использовать функцию сравнения ().

C:

 char str1[10] = "one";
 char str2[10] = "two";

 if (strcmp(s, t) != 0) // if they are equal compare return 0

C ++

 string str1 ("one");
 string str2 ("two");
 if (str1.compare(str2) != 0) // if they are equal compare return 0
0 голосов
/ 28 августа 2013

strcmp () поможет вам сравнить два символа * http://www.cplusplus.com/reference/cstring/strcmp/?kw=strcmp

0 голосов
/ 25 февраля 2010

Если вам нужно сравнить два указателя символов , вы можете сравнить их обычным способом: с помощью операторов сравнения <, >, == и т. Д.

Проблема в этом случае в том, что вам не нужно сравнивать два указателя на символы. Однако вам нужно сравнить две строки в стиле C , на которые указывают эти указатели символов. Чтобы сравнить строки в стиле C, вы должны использовать стандартную функцию strcmp.

Вдобавок к этому подход к обработке нулевых элементов в вашем алгоритме сортировки, похоже, не имеет никакого смысла. Представьте себе входной массив, который содержит чередующиеся нулевые и ненулевые указатели. Очевидно, что ваш алгоритм сортировки никогда ничего не сортирует, так как условие в вашем if никогда не будет истинным. Вы должны пересмотреть свою обработку нулевых элементов. Конечно, в первую очередь, вы должны решить, что с ними делать. Игнорировать и оставить на месте? Нажмите на один конец массива? Что-нибудь еще?

0 голосов
/ 25 февраля 2010

Вы должны действительно использовать qsort (в C, #include <stdlib.h>) или std::sort (в C ++, #include <algorithm>) вместо пузырьковой сортировки, подобной этой. Если это C ++, и вы принимаете совет @ TED использовать std::string вместо необработанных строк C, вам даже не нужно указывать сравнение, потому что оператор < будет использоваться и будет делать правильные вещи.

0 голосов
/ 25 февраля 2010

Я, конечно, предполагаю, что здесь у вас есть символ * для машины

int i, j;
for(i=0; i<100; i++){
    for(j=0; j<100-i; j++){
        if(carArray[i]!=NULL && carArray[j]!= NULL && carArray[j+1]!=NULL){
            if(strcmp(carArray[i]->make, carArray[j+1]->make) == 0)
            {
                //Do whatever here
            }
        }
    }
}

Вы хотите сравнить с 0, потому что strcmp вернет 0, если между двумя строками нет различий.
strcmp принимает два постоянных символа *.
http://www.cplusplus.com/reference/clibrary/cstring/strcmp/

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