Почему не удается передать строковой литерал в функцию, принимающую char*?
Все дело в том, что строковой литерал в C++ имеет константный тип.
Когда ты делаешь вызов get_substr("один", "два три четыре"), ты в функцию передаешь два строковых литерала, тип которых - const char[ N ], где N - это длина строки литерала включая терминальный символ '\0'.
Неявное преобразование типа из const char* в char* недопустимо, поэтому компилятор и пишет тебе ошибку.
На самом деле, тебе в твоем тексте char* вообще не нужен, т.к. полностью все операции у тебя не приводят к изменению состояния строки. Заменить char* на const char* будет и логичнее, и понимаемость кода тоже улучшит.
А еще сто раз говорили, что копипаста это зло.
Надо разорвать этот порочный круг.Копирайт The C programming language 1978 Kerninghan, Brian W.#include <stdio.h>

int index(char[], char[]);

int main()
{
  char* str = "foo bar baz";
  char* str2 = "barz";
  
  if(index(str, str2) != -1)
    printf("found");
  else
    printf("not found");
  return 0;
}

int index(char s[], char t[])
{
  int i, j, k;
  for (i = 0; s[i] != '\0'; i++)
  {
    for (j = i, k = 0; t[k] != '\0' && s[k] == t[k]; j++, k++)
      ;
    if(t[k] == '\0')
      return i;
  }
  return -1;
}