C или C++. Как сравнить две строки, данные символ * указатели?

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

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]);
            }
        }
    }
}

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

9
задан Adrian McCarthy 28 August 2013 в 16:17
поделиться

7 ответов

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

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

30
ответ дан 4 December 2019 в 06:06
поделиться

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

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

2
ответ дан 4 December 2019 в 06:06
поделиться

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

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
1
ответ дан 4 December 2019 в 06:06
поделиться

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

13
ответ дан 4 December 2019 в 06:06
поделиться

Я, конечно, предполагаю, что здесь у вас есть 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(strcmp(carArray[i]->make, carArray[j+1]->make) == 0)
            {
                //Do whatever here
            }
        }
    }
}

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

0
ответ дан 4 December 2019 в 06:06
поделиться

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

0
ответ дан 4 December 2019 в 06:06
поделиться

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

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

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

0
ответ дан 4 December 2019 в 06:06
поделиться