В C есть способ узнать, когда достигнут конец строки. Есть ли способ узнать начало при повторении в обратном направлении? - PullRequest
1 голос
/ 16 октября 2010

Я делаю K & R Упражнение 5-4 (p107).

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

Я подумал, что лучший способ сделать это ... ... 1009 *

  • увеличивает оба указателя до конца
  • считать в обратном порядке через обе строки, в то время как каждый символ соответствует
  • вернуть 1, если мы закончили считать до начала второй строки

Итак, вот что у меня есть ...

int strend(const char *str1, const char *str2) {
   int i = 0; 
   while (*str1++ != '\0');

   while (*str2++ != '\0') {
      i++;
   }
   i++;

   while (*str2-- == *str1-- && i > 0) {
     i--;
   }

   return (i == 0);
}

Как видите, я использовал счетчик, чтобы узнать, когда я прибыл в начало второй строки.

Есть ли другой цикл, который я могу использовать без счетчика, чтобы сообщить, когда мы достигли начала строки (аналогично поиску \0 для конца строки)?

Спасибо.

Обновление

Не думал использовать указатели - я все еще учусь и кое-что забываю!

Я придумал это ...

int strend(const char *str1, const char *str2) {
   char *start = str2; 
   while (*str1++ != '\0');

   while (*str2++ != '\0');

   while (*str2-- == *str1--) {
     if (str2 == start) {
         return 1;
     }
   }

   return 0;
}

Ответы [ 5 ]

4 голосов
/ 16 октября 2010

Проверить совпадение указателей?

2 голосов
/ 16 октября 2010

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

например,

int lenS = strlen(s);
int lenT = strlen(t);

for (int i = 0; i < lenT; ++i) {
  if (s[lenS - i] != t[lenT - i])
    return 0;
}

return 1;
2 голосов
/ 16 октября 2010

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

1 голос
/ 16 октября 2010

, если вам разрешено использовать строковые функции:

int strend(char *s, char *t)
{
    char *st = s + strlen(s) - strlen(t);
    if (st < s) return 0;
    if (!strcmp(st,t)) return 1;
    return 0;
}

Еще лучше от tia (комментарии):

int strend(char *s, char *t)
{
    char *st = s + strlen(s) - strlen(t);
    if (st >= s) return !(strcmp(st,t)); else return 0

}

1 голос
/ 16 октября 2010

В начале строки C нет индикатора, который бы указывал, где именно начинается строка.Вы должны сохранить некоторую ссылку на начало строки, например, сделать копию указателя str1.

. Кроме того, для этого упражнения вам не нужно делать это с обратным сканированием.Вы можете сделать это с помощью прямого сканирования, и есть определенные проверки, которые вы можете проверить, стоит ли даже беспокоиться, если str2 в str1.

...