проблема нулевого терминатора при сравнении идентичных символов * - PullRequest
0 голосов
/ 24 сентября 2010

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

функция сравнения:

int StringCompare(const char* str1, const char* str2)  
{
    int size1 = strlen(str1), size2 = strlen(str2), min = 0, index =0;  
    bool bigger1 = true;  
    if(size1>size2)  
        min=size2;  
    else  
        min=size1;  
    for(index=0;index<min;index++)  
    {  
        if(str1[index]>str2[index])  
            return 1;  
        if(str1[index]<str2[index])  
            return (-1);  
    }  
    if(size1==size2)  
        return 0;  
    if(min==size1)  
        return (-1);  
    else  
        return 1;  
}    

спасибо!

Ответы [ 9 ]

5 голосов
/ 24 сентября 2010

Используйте std :: string, вот для чего он.В противном случае используйте strcmp ().

4 голосов
/ 24 сентября 2010

Пожалуйста, прочитайте эту публикацию о C Strings и поймите это.ВСЕ строки c требуют нулевого терминатора, чтобы показать среде выполнения C, что конец строки достигнут.Термин nul равен \0.Обратите внимание на различие между использованием nul и null, чтобы устранить любые возможные путаницы - при работе со строками, его nul, с указателями на NULL!

4 голосов
/ 24 сентября 2010

Вы вызываете strlen для обоих, поэтому лучше, чтобы у обоих в конце были NUL (не NULL). Как только вы доберетесь до одного из NUL, вам нужно прекратить сравнение, потому что строка готова! Это оно! Любые последующие данные не принадлежат этой строке.

4 голосов
/ 24 сентября 2010

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

3 голосов
/ 24 сентября 2010

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

for(index=0;;index++)  
{  
    if(!str1[index]) {
        if(!str2[index]) 
            return 0; // strings are equal in length
        return -1; // str1 < str2 since str2 is longer
    }
    if(!str2[index]) 
        return 1;  // str1 > str2 since str1 is longer     

    if(str1[index]>str2[index])  
        return 1;  
    if(str1[index]<str2[index])  
        return (-1);  
}  

Обратите внимание, что это имеет тот же эффект, что и ответ Matteo Italia.

3 голосов
/ 24 сентября 2010

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

Предположим, у вас есть две строки:

"abc\0"
"abcdef\0"

Строка 2 оканчивается нулем? Или "def \ 0" часть всего лишь случайного мусора?

Единственный способ убедиться в этом - завершить все строки нулем.

3 голосов
/ 24 сентября 2010

Я надеюсь, что обе ваши char* строки имеют нулевые терминаторы в конце! Терминатор null позволяет функциям, таким как strlen, определять длину и знать, когда заканчивается строка.

2 голосов
/ 24 сентября 2010

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

2 голосов
/ 24 сентября 2010

Ваш код не может работать, если только оба str1 и str2 не имеют нулевых терминаторов. В противном случае, как вы (или strlen) знаете, как долго они?

Если реальный вопрос - «Как я могу работать со строками, которые содержат встроенные символы NUL?» , вам следует использовать vector<char> или аналогичный. Вы больше не говорите о строках, потому что по определению строки заканчиваются NUL.

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