Отправляет email-рассылки с помощью сервиса Sendsay

За 2013-05-24

[prg] Re[5]: переписать с паскаля на си.

Приветствую всех.

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

> int find (char *s, char *sub)

Параметры функции можно обозначить как константные: во-первых, если вы ненароком
внутри функции измените содержимое строк, то компилятор предупредит вас о запрете
на такие операции. Во-вторых, константные параметры дают понять тому, кто будет
использовать вашу функцию, что вы гарантируете ему неизменность параметров.
В итоге сигнатура функции будет такой:
int find( const char *s, const char *sub)

> if (strlen(sub) > strlen(s))
> {
> printf("error\n");
> }

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

> for (i =0; i <=strlen(s) -strlen(sub) +1; ++i)

Обратите внимание, что в предыдущем фрагменте кода вы уже вычисляли длины строки
и подстроки (вызывали функции strlen(s) и strlen(sub)). Вызов функции в любом
языке программирования -- это одно из самых затратных действий, поэтому если
возможно, то количество вызовов функций желательно минимизировать, например,
сохраняя результаты их работы в локальных переменных.
Кроме того, в языке Паскаль определение длины строки - это быстрая операция,
а в языке C -- медленная. Это связано с форматом представления строк в этих языках.
В последующем коде у вас еще дважды встречаются вызовы strlen(sub), без которых
вполне можно обойтись, если принять во внимание, что в языке C конец строки можно
определить по нулевому байту.
То есть вместо
for (j=0; j<strlen(sub); j++)
можно написать
for(j=0; sub[j]!=0; j++)
...

Ваша функция должна возвращать целое (int), а у вас перед последней закрывающей
фигурной скобкой отсутствует элемент return с возвращаемым значением.

Успехов. Анатолий.

   "i_chay" 2013-05-24 20:29:00 (#2752272)

[prg] Re[4]: переписать с паскаля на си.

здравствуйте.
24.05.2013 11:04, "i_chay" пишет:
> Так что присылайте свой вариант. Если будут ошибки, вас поправят.
> Успехов.

Прошу не судить строго.

int find (char *s, char *sub)
/* ичем sub в s */
{
int i, j;
if (strlen(sub) > strlen(s))
{
printf("error\n");
}
for (i =0; i <=strlen(s) -strlen(sub) +1; ++i)
{
for (j =0; j < strlen(sub); ++j)
{
if (sub[j] !=s[i +j])
{
return 0;
}
else
{
if (j ==strlen(sub))
{
return i;
}
}
}
}
}

   2013-05-24 18:33:30 (#2752191)

[prg] Re[3]: переписать с паскаля на си.

Приветствую всех.

> А если без использования strstr()?

Тогда, во-первых, это будет вариант сдословным переводом. Во-вторых, в практическом
смысле такой вариант малополезен, поэтому я предполагаю, что это либо учебный
пример, либо учебное задание. А для целей обучения предпочтительнее, чтобы вы
написали такой код самостоятельно.
Так что присылайте свой вариант. Если будут ошибки, вас поправят.

Успехов. Анатолий.

   "i_chay" 2013-05-24 07:12:19 (#2751650)