Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Алгоритмы получения последнего символа в строке  (Прочитано 11141 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Victor
Интересующийся

ru
Offline Offline

« : 15-07-2015 19:31 » 

Доброе время суток. Вопрос может и примитивный, но как мне подсказывает опыт наиболее простые задачи как раз требуют сложного решения:
Какие существуеют алгоритмы получения последнего символа в строке и какой наиболее предпочтителен?
PS
Код:
#include <stdio.h>
#include <string.h>


char * get_last(char str[])
{
    return str + strlen(str) - 1;
}
int main()
{

    char str[] = "Last Char is @";
    char * c = get_last(str);
    printf("%s\n",c);
}

Это я видел;)
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 15-07-2015 20:23 » 

Для не Unicode нультерминальной строки
Код: (C++)
char *get_last(char *str) {
        if (*str) {
                while (*str) ++str;
                --str;
        } else {
                str = 0;
        }
        return str;
}
« Последнее редактирование: 15-07-2015 20:25 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 15-07-2015 23:07 » 

как мне подсказывает опыт наиболее простые задачи как раз требуют сложного решения

Опыт вас вводит в заблуждение.

Это я видел;)

Случайно не там же видели, где и пародию на "декоратор"? Возникает смутное подозрение, что наш форум используется для раскрутки посещений этой ереси, и не у меня одного.

Наиболее предпочтительный для меня вариант, если уж действительно интересно:

Код: (Ruby)
s = "The string"
puts s[-1]

выдает результат:

g

P.S. Разумеется, это относится к получению последней литеры (character) строки, поскольку символов (symbol) в строках отродясь не бывало, это совершенно другой тип данных.
« Последнее редактирование: 15-07-2015 23:32 от Dale » Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Victor
Интересующийся

ru
Offline Offline

« Ответ #3 : 16-07-2015 20:20 » new

Спасибо.

Конструкции типа  mystr[-1]  из  Ruby я знаю. Я думал может есть какой-то адвансный метод для СИ. Похоже нет, разве что asm вставки. Но всем спасибо!:)

PS
2Dale. Да я скопирывал код с того же сайта. И?Ага Скажите, исключив мысль о ИИ:) -  как Вы считаете копи-паст с одного сайта на другой вообще может повлиять на какие-либо рейтинги поисковика?Ага


Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 16-07-2015 22:33 » 

Я думал может есть какой-то адвансный метод для СИ. Похоже нет, разве что asm вставки.

Во-первых, тема называется "Алгоритмы получения последнего символа в строке". Во-вторых, размещена она в разделе "Алгоритмы и математические задачи". Каким образом это связано с языком C? То, что вы при этом думали, доступно разве что победителям "битвы экстрасенсов", но никак не обделенным телепатическими способностями программистам-завсегдатаям этого клуба.

Во-вторых, в языке C просто отсутствует стандартный строковый тип данных (поскольку разрабатывался он совершенно для других целей), поэтому сам предмет обсуждения отсутствует как таковой; можно разве что говорить о массиве литер, терминированном нулевым байтом, который используется за неимением лучшего.

В C++ на уровне библиотек уже появляются более функциональные варианты, как string из Стандартной Библиотеки C++ или CString из библиотеки MFC; есть и другие варианты, в которых низкоуровневые детали реализации содержимого строки могут отличаться.

В древнем Borland TurboPascal'е для хранения коротких строк (<=255 литер) использовался массив, первый байт которого хранил длину строки, а остальные - ее содержимое; таким образом, для определения размера строки не было необходимости перебирать ее всю политерно  в поисках нулевого терминатора (которого, кстати, там и не было за ненадобностью).

Мораль: бессмысленно говорить об алгоритмах работы с абстрактной строкой - это "сферический конь в вакууме" (в том же Ruby эта задача решается совершенно те так, как в C). Имеет смысл лишь конкретная реализация для конкретного языка. Вот, скажем, определение длины нуль-терминированного литерного массива - предмет вполне конкретного разговора (за исключением того, что в функциях стандартной библиотеки C работа с такими "строками" давно уже реализована производителем компилятора в лучшем виде, и "оптимизаторам" ловить там совершенно нечего).

В-третьих, ассемблерные вставки нужны здесь (в данном конкретном случае "строк" на C), как зайцу стоп-сигнал, поскольку используется типичная работа с указателями, под которую язык C заточен максимально эффективно, и подобные медвежьи услуги компилятору в итоге обычно только ухудшают код, поскольку мешают оптимизации. И еще любопытно узнать, на ассемблере какого именно процессора они будут написаны; будет ли, к примеру, поддерживаться архитектура ARM? В погоне за мифическим ускорением полностью теряется основной и на сегодня чуть ли не единственный козырь языка C - портируемость кода.

PS
2Dale. Да я скопирывал код с того же сайта. И?Ага

Да кто бы сомневался... Этот неподражаемый стиль узнать было нетрудно, пролистав там пару-другую статеек. Перефразируя классика, "все красивые программы похожи друг на друга, каждая кривая программа крива по-своему".

как Вы считаете копи-паст с одного сайта на другой вообще может повлиять на какие-либо рейтинги поисковика?Ага

Вы притворяетесь или действительно не понимаете разницы между копипастой и ссылкой? Лично я ее кликнул, сначала из интереса (ну мало ли, вдруг там какие-то тонкости работы с декораторами, которые я упустил), потом еще несколько статей проглядел, уже чисто поржать. Так что невинность симулировать тут особо нет надобности - и посещаемость у сайта клуба не так мала, чтобы счетчик переходов накрутить, и в индексы ссылка просочится, поскольку ее не везде еще модератор поправил.

Поэтому давайте вести честную игру: пришли в клуб прояснить интересные для себя вопросы - добро пожаловать, задавайте, поможем, чем только сможем (только задавайте их, а не вынуждайте угадывать, что же вам действительно нужно). Пришли попиарить творение юных кулхацкеров - здесь такое без надобности, кнопку выхода с форума найдете без труда.
« Последнее редактирование: 16-07-2015 22:40 от Dale » Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines