Нахождение последнего символа строки без функции в C - PullRequest
0 голосов
/ 31 декабря 2018

Я хочу найти последний элемент строки без использования каких-либо функций.Кажется, мой код работает, но я не совсем уверен, почему он работает так, как работает, и был бы рад вводу.Вот код

#include <stdio.h>

char *find_last(char *s);

int main(void)
{
    char string[] = {"This is an Example"};
    find_last(string);
    return 0;
}

char *find_last(char *s)
{
/*  char last;*/
    while (*s++ != 0) {}
    printf("*s ist %c", *(s-2));
    return 0;
}

Я не понимаю, почему я должен печатать * (s-2) вместо * (s-1), чтобы получить последний символ.(Чтобы вернуть еще одного персонажа, мне нужно только уменьшить еще один, то есть * (s-3)).

О, и, кроме того, кажется, что содержимое * s похоже на букву O (от меня до сих пор ошибочно принимается за ноль), независимо от строки-примера, протестированной с.Это почему?Я думал, что это должен быть ноль (0), потому что я увеличиваю указатель, пока он не достигнет двоичного нуля.

Спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 01 января 2019

OP позже спросил об обработке углового случая, включающего "".

Сначала рекомендую уточнить цель "найти последний элемент строки".По определению: в C

A string - это непрерывная последовательность символов, оканчивающаяся первым нулевым символом и включающая его.C11 §7.1.1 1

Поскольку строка содержит нулевой символ и последний, то «Поиск последнего символа строки» всегда нулевой символ .

Конечно, OP интересуется последним символом перед нулевым символом .Так как такая функция может получить допустимую строку "" и не сможет найти такой символ, то find_last() может как-то выдать ошибку или, возможно, вернуть условие ошибки, например NULL ниже ипусть звонящий решит.

Начиная с OP-подобного кода

char *find_last(char *s) {
  printf("Last character before the null character in \"*s\"", s);
  if (*s == '\0') {
    printf(" does not exist.\n");
    return NULL;
  }
  while (*s) {
    s++;
  }
  s--;
  printf(" is '%c'\n", *s);
  return s;
}
0 голосов
/ 31 декабря 2018

Так как ++ является оператором постинкремента, это то, что происходит в цикле while:

  1. *s сравнивается с 0.
  2. s увеличивается.
  3. Если сравнение успешно, цикл завершается.

Когда s достигает конца строки, он указывает на нулевой символ.Он увеличивается, чтобы указывать на символ после null, а затем цикл завершается.В этот момент:

*s = символ после нуля, который в вашем случае является буквой O.

*(s-1) = символ нуля.

*(s-2) = последний символ в строке.

...