[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 с возвращаемым значением.
Успехов. Анатолий.