я пытался определить функцию конца строки в упражнениях K & R - PullRequest
0 голосов
/ 02 июля 2018

Я попытался определить strend(s,t) функцию, которая возвращает 1 , если строка t в конце строки s и ноль в противном случае, это мой код.

typedef enum state
{
    Not_occured ,
    occured
}State;
char a[]="Hello world zone";
char b[]="ne";
int main(void)
{
    int x = 0 ;
    x =  strend(a,b);
    printf("%d",x);
    return 0;
}

int strend(char *s, char *t)
{
    while(*++s);
    while(*++t);
    while(*t-- == *s--)
        if(!(*t))
            return occured;
    return Not_occured;
}

модифицированный код

int strend(char *s, char *t)
{
    char *ptr = s;
    while(*++s);
    while(*++t);
    while(*t-- == *s--)
        if(s == ptr)
            return occured;
    return Not_occured;
}

почему префикс работал здесь while(*++s);, while(*++t);, а постфикс не работает?

1 Ответ

0 голосов
/ 02 июля 2018

if(!(*t)) предполагает наличие нулевого символа перед первым символом в строке. Это не только неверное предположение, но и попытка доступа к памяти за пределами массива.

Кроме того, while(*t-- == *s--) ... Что происходит, когда 2 строки идентичны или t длиннее s?

Вот простое решение:

int strend(char *s, char *t) {
    if (s == NULL || t == NULL) return Not_occured;

    size_t s_len = strlen(s);
    size_t t_len = strlen(t);

    if (t_len <= s_len) {
        return 0 == strcmp(&s[s_len - t_len], t) ? occured : Not_occured;
    }
    return Not_occured;
}

Поскольку теперь стало яснее, что исходный вопрос касается операций до и после исправления, я обновил.

Во-первых, поймите разницу между ними:

int x = 1;
printf("%d", x++);
// Prints 1 because x is evaluated before the inc
x = 1;
printf("%d", ++x);
// Prints 2 because x is evaluated after the inc

Теперь некоторые операторы имеют приоритет:

postfix > dereference
prefix == dereference, right-to-left assoc.

Что происходит с *s++:

  1. s++ оценивается - сначала сохраняется текущее значение s (назовем это s0), затем увеличивается s
  2. s0 разыменовано

Это то же самое, что и

char *s0 = s;
s += 1;
char c = *s0;

Что происходит с *++s:

  1. s увеличивается
  2. s разыменовано

Это то же самое, что и

s += 1;
char c = *s;

Надеюсь, это имеет смысл.

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