Функция strncmp не останавливает проверку на n символов? - PullRequest
0 голосов
/ 15 февраля 2012

Моя программа полностью сравнивает 2 строки и не останавливается при достижении n символов?Почему это происходит?

int strncompare (const char* mystring1,const char* mystring2, int number)
{
    int z;
    z = number - 1;
    while ((*mystring1==*mystring2) && (*mystring1 != '\0') && (*mystring2 != '\0'))
    {
        *mystring1++;
        *mystring2++;
        if ((*mystring1 == mystring1[z]) && (*mystring2 == mystring2[z])) 
        {
            break;
        }
    }
    return (mystring1++ - mystring2++);
    }

Ответы [ 6 ]

1 голос
/ 15 февраля 2012

Потому что вы не останавливаетесь, сравнивая number символов.

Есть несколько способов сделать это, но я бы порекомендовал изменить условие вашего цикла на

while (*mystring1 && *mystring2 && *mystring1 == *mystring2 && number-- > 0)

Также удалить

if ((*mystring1 == mystring1[z]) && (*mystring2 == mystring2[z])) 
{
    break;
}

Потому что, хотя кажется, что это была ваша попытка остановить это, оно закодировано неправильно; вам все равно, если символы совпадают, вам важно только то, что вы сравнили number символы. Также вы используете &&, что делает условие еще более ограничительным, чем оно было.

Также изменить

*mystring1++;
*mystring2++;

К

mystring1++; // or better, ++mystring1
mystring2++; // or better, ++mystring2

* разыменовывает указатель, но вы ничего не делаете с ним, так что это бессмысленно ( каламбур предназначен ).

Вы также можете удалить ++ из этих:

return (mystring1++ - mystring2++);

Так было бы

return mystring1 - mystring2;

Однако это неопределенное поведение, когда два указателя указывают на разные массивы (что они, вероятно, всегда будут). Вы должны делать что-то еще. Какие? Я не знаю, потому что я не знаю, что должна возвращать ваша функция.

0 голосов
/ 15 февраля 2012

Спасибо всем ... Я исправил ошибку ... добавил еще одно условие в цикл while.

int i;
i=0;
z = number - 1;

while((*mystring1==*mystring2) && (*mystring1 !='\0') && (*mystring2 !='\0') && (i<z))

и затем увеличивая i, пока не выйдет из этого цикла.

0 голосов
/ 15 февраля 2012

Это будет идти, пока не найдет разницу или конец строки.

while(n > 0) {
    if(*str1 != *str2 || *str1 == '\0'){
          return *str1 - *str2;; //they're different, or we've reached the end.
    }
    ++str1; //until you understand how ++ works it's a good idea to leave them on their own line. 
    ++str2;
    --n;
}
return 0;// I originally had *str1 - *str2 here, but what if n came in as zero..

проблема с z-сравнением - это движущаяся цель. думать о [] как знак +. mystring1 [z] можно представить так * * (mystring1 + z) Это означает, что строка выше ++ mystring1; (как и должно быть) перемещает указатель и, следовательно, перемещается туда, куда смотрит z ..

Это может помочь думать об указателях как об адресах на улице ... когда вы ++ поднимаетесь по дому ... Скажите z = 1 .. и дом, на который указывает mystring1, ваш, а z ваш сосед. добавьте один к дому, на который вы смотрите, и mystring1 теперь указывает на вашего соседа, а z указывает на его соседа, потому что z все еще говорит, на что вы указываете + 1.

0 голосов
/ 15 февраля 2012

Вы должны обновлять z на каждой итерации, а затем проверять, достигает ли она нуля, попробуйте добавить это к своему коду:

if (z == 0)
    break;
else
    z -= 1;

Кроме того, эта проверка действительно неисправна, если она сработала, она могла быостановка в нежелательное время, например, в строках «abcdec» и «xxcddc», где number = 6, она остановится на 3, потому что символы в этих индексах совпадают с символами в индексе 6.

Перечитайте ваш код очень тщательно и убедитесь, что вы действительно понимаете его, прежде чем принимать во внимание любой из этих ответов.

0 голосов
/ 15 февраля 2012

Почему бы вам просто не уменьшить число и не оборвать его, когда оно достигнет 0, предполагая, что цикл к этому моменту не разорван

0 голосов
/ 15 февраля 2012

В вашей функции нет условия, которое проверяет number или z, которые вы производите от нее. Что бы остановить это?

...