2013-11-30 3 views
-3

может кто-нибудь сказать мне, что здесь делает программа?C++ считать значение указателя символа []

if (*p1 == '\0' || *p2 == '\0') { 
     return (*p2 == '\0') - (*p1 == '\0'); 
    } 

я правильно, если программа сравнения pointerposition к nullcharacter (последний символ) , и если один из них так, то она возвращает длину указателя p2 в положении nullcharacter, вычитают из длины указателя p1 на nullcharacter?

вот моя полная программа:

#include <iostream> 
#include <stdio.h> 
#include <string.h> 

using namespace std; 



int strcmp_ign_ws(const char *s1, const char *s2) { 
    const char *p1 = s1, *p2 = s2; 
    int count(0); 

    while (true) { 
    while (*p1 != '\0' && (*p1 == ' ')) p1++; 
    while (*p2 != '\0' && (*p2 == ' ')) p2++; 
    if (*p1 == '\0' || *p2 == '\0') { 
     return (*p2 == '\0') - (*p1 == '\0'); 
    } 
    if (*p1 != *p2) { 
     count += (unsigned char)*p2 - (unsigned char)*p1; 
    } 
    p1++; 
    p2++; 
    } 
    return count; 
} 


int main() { 

    char a[] = "Hallo Weltt"; 
    char b[] = "Hallo Welt"; 

    int result(0); 

    result = strcmp_ign_ws(a,b); 

    cout << result << endl; 

    return 0; 
} 
+1

№. Оператор 'return' выдает два булевых выражения; что бы это ни было полезно. –

ответ

1

Если какой-либо из p1 или p2 точек до конца строки (ноль символов, '\0'), то она возвращает разницу булевых выражений (p2=='\0' и p1=='\0').

p1=='\0' здесь означает, что указатель указывает на конец строки.

Оба булевы будет повышен до int и вычитали, возвращая 0, 1 или -1.

Возвращаемое значение 0 означает, что оба указателя указывают на конец строки (т. Е. Строки одинаковы).

Другие значения означают строки не совпадают (1 означает строка p1 длиннее, чем p2, -1 означает p2 больше, что p1).

На стороне записки, остальные функции, кажется, сломана, значение count никогда не будет использоваться в любом месте ...

This question может быть интересно для вас.

EDIT: Предположим, что вы хотите только функциональность станд :: STRCMP игнорируя пробельные, то вы можете написать что-то вроде:

int strcmp_ign_ws(const char *p1, const char *p2) { 
    while (true) { 
     while (*p1 == ' ') p1++; 
     while (*p2 == ' ') p2++; 
     if (*p1 == '\0' || *p2 == '\0') { 
      return (*p2 == '\0') - (*p1 == '\0'); 
     } 
     if (*p1 != *p2) { 
      return static_cast<int>(*p2) - static_cast<int>(*p1); 
     } 
     p1++; 
     p2++; 
    } 
} 

Хотя это решение должно работать, вы бы лучше с помощью std::string как сказал Джерри Коффин. Чтобы сохранить семантику этого пробела, игнорируя сравнение строк, вы можете просто удалить все белые пробелы из обеих строк, а затем сравнить их по std::string::compare().

+0

спасибо, но как я могу изменить свой код тогда? – user2774480

1

У вас есть (IMO) плохо спроектированная функция - она ​​пытается вернуть две совершенно разные виды информации, что было бы неоднозначно, если бы оно было достаточно свободным от ошибок, чтобы на самом деле делать то, что кажется был предназначен.

Оператор return, который вы просматриваете, сравнивает символы в каждой строке с '\ 0', чтобы увидеть, находится ли она в конце хотя бы одной из строк. Если он находится в конце хотя бы одной строки, он возвращает -1, 0 или 1, чтобы указать, какая строка длиннее (игнорируя пробел). (-1 = вторая строка длиннее, 1 = первая строка дольше, 0 = строка одинаковой длины).

Он также подсчитывает несовпадения в строках в count и имеет код предназначен вернуть количество несовпадений (но никогда не может реально сделать что-нибудь полезное, так как единственный выход из цикла while (true) осуществляется через первый return).

Что касается того, как делать примерно то же самое, многое зависит от остальной части вашего кода. В большинстве случаев для большинства строк, вероятно, следует использовать std::string. Вместо использования трехстороннего результата, полученного этим кодом, вы обычно должны использовать результат bool, указывающий, является ли какая-либо строка A длиннее некоторой строки B. Почти единственная функция, которая хочет получить этот трехсторонний результат: qsort - если вы При использовании этого вы обычно должны переключиться на использование std::sort (и для этого требуется только результат bool).

+0

спасибо, есть ли другой способ сравнить длину строк с указателями без этого логического метода? – user2774480

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