Вот ошибки, которые я вижу:
Использование неинициализированного указателя
В substr
вы объявляете char *temp;
, а затем используете его, ничего не инициализируя.Это не ошибка во время компиляции, но эта программа почти наверняка завершится сбоем при запуске, поскольку temp
будет эффективно указывать на случайный адрес памяти.Это случай неопределенного поведения , и C переполнен этим.Неопределенное поведение придет из ниоткуда и съест ваших питомцев, если вы не будете осторожны.
Рассмотрите malloc()
немного памяти или попросите вашу функцию получить указатель на буфер, в который она может записать частьstring.
Использование функции, еще не объявленной
В C вы должны объявить функции перед их использованием или, по крайней мере, объявить их прототип.Над объявлением main()
добавьте эту строку:
char * substr(char *string, int start, int length);
Не использовать const
там, где это имеет смысл
При назначении строкового литерала для char*
этой переменнойдолжен быть объявлен const
.Так что измените
char *string = "abcdefghi";
на
const char *string = "abcdefghi";
Вам придется изменить прототип вашей функции на
char * substr(const char *string, int start, int length)
, что должно быть в первую очередь.
Добавлено 2010-12-02:
substr()
не добавляет завершающий нулевой символ
Функция substr()
, хотя алгоритмически корректнав любом другом смысле не добавляет завершающий нулевой символ в новую строку.Это приведет к тому, что printf()
и любая другая функция, использующая строки (например, strlen()
, strcpy()
и т. Д.), Выполнит запуск конца строки в нераспределенную кучную память или в стек стека (в зависимости от того, как вы решите "«неинициализированный указатель».)добавлен в цикл for, поскольку это приведет к созданию строки нулевой длины.