2017-02-03 3 views
-2

Этот фрагмент кода отлично работает. Но мне интересно, можно ли это сделать более эффективным способом?указатели в функции C

Более конкретно эта часть *(s1 + i), если это возможно, чтобы заставить ее последовательно следовать по всему символу массива символом с помощью указателя, например *s1++. Моя задача выполнить эту функцию compareStrings без индексного массива [].

int compareStrings(const char *s1, const char *s2) 
{ 
    int i = 0, answer; 
    // i - to sequence through array of characters 
    // pointer to character string1 and character string2 
    while (*(s1 + i) == *s2 + i && *(s1 + i) != '\0'&& *(s2 + i) != '\0') 
    { 
     i++; 
    } 

    if (*(s1 + i) < *(s2 + i)) 
     answer = -1;    /* s1 < s2 */ 
    else if (*(s1 + i) == *(s2 + i)) 
      answer = 0;     /* s1 == s2 */ 
     else 
      answer = 1;     /* s1 > s2 */ 

     return answer; 

Но я хочу, чтобы изменить его s1++ и s2++ InstEd из *(s1 + i) и *(s2 + i). Я попытался реализовать эту идею, сославшись на дополнительный указатель на начало, но я потерпел неудачу. Вот код ->

int compareStrings(const char *s1, const char *s2) 
{ 
    int answer; 
    char **i = s1, **j = s2; 
    // i and j - to sequence through array of characters 
    while (*(i++) == *(j++) && *(i++) != '\0'&& *(j++) != '\0'); 

    if (*i < *j) 
     answer = -1;    /* s1 < s2 */ 
    else if (*i == *j) 
     answer = 0;     /* s1 == s2 */ 
    else 
     answer = 1;     /* s1 > s2 */ 

    return answer; 
} 
+5

Я думаю, что он лучше подходит для [обзора кода] (http://codereview.stackexchange.com/) – yeputons

+1

while (* (s1 + i) == * (s2 + i) && * (s1 + i)! = '\ 0' && * (s2 + i)! = '\ 0') – Yellowfun

+0

Спасибо! @yeputons! – Yellowfun

ответ

2

Для сравнения C-строки, все, что вам нужно, это

int str_cmp(const char* s1, const char* s2) 
{ 
    while (*s1 != 0 && *s2 != 0 && *s1 == *s2) 
    { 
     ++s1; 
     ++s2; 
    } 

    if (*s1 == *s2) 
    { 
     return 0; 
    } 

    return *s1 < *s2 ? -1 : 1; 
} 
1

Последний код не работает, потому что вы увеличиваете s1 дважды:

*s1++ == *s1++ 

Это будет:

  1. Получить значение s1
  2. Dereferene it
  3. Increment by 1
  4. Затем с правой стороны сделайте то же самое
  5. И только тогда сравните его.

Вы в основном делают это:

*(s1) == *(s1+1) 

Я думаю, что должно быть на самом деле:

*s1++ == *s2++ 
+2

Вы уверены в '* (s1 + 1) == * (s1 + 2)'? Это будет '* (s1) == * (s1 + 1)', потому что приращение постфикса возвращает старое значение. –

+0

Хороший улов. Исправлено это! – Dan

+0

Я не уверен, но для меня '* s1 ++ == * s1 ++' имеет ** _ undefined behavior _ **, потому что '==' не является [точкой последовательности] (http: // stackoverflow.com/questions/3575350/sequence-points-in-c), поэтому вы не знаете, какие 's1 ++' (слева или справа) оцениваются первыми. поэтому вы можете абсолютно не сказать, что эквивалентно '* (s1) == * (s1 + 1)', потому что он также может быть '* (s1 + 1) == * (s1)' или что-то еще (неопределенное поведение) – Garf365

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