Основной проблемой здесь является необходимый сдвиг в мышлении, так как C и Java - это разные языки, и они достаточно различны здесь, чтобы сбить вас с толку. Помимо предупреждающего сообщения, о котором сообщается в вопросе, имеются дополнительные ошибки.
В некотором смысле в C нет строк. C не имеет строкового типа. Вместо этого у него есть соглашение о том, как обрабатывать буферы / массивы char, чтобы они действовали как строки. В частности, нулевой терминатор используется для обозначения конца «строки» или используемой в данный момент части буфера.
Таким образом, строка стиля C представляет собой массив / буфер, который содержит последовательность символов заканчивается нулевым символом ('\ 0'). Вы несете ответственность за предоставление достаточно большого буфера для размещения всех символов и нулевого терминатора, за то, что вы никогда не пытаетесь вставить в него больше символов, чем поместится, и сохраняете его нулевым. Переменная char * не является строкой или просто как строка, хотя используется при работе со строками в стиле C.
Так что в:
void split_string_at_index(char* string, int index, char* left, char* right) {
int size = sizeof(string);
ваша "строка" не является строка, это указатель на символ, и его размер не имеет никакого отношения к длине строки, к которой он дает вам доступ. Вы хотите:
int size = strlen(string);
Далее:
char* r[MAX_SUBSTRING];
char* l[MAX_SUBSTRING];
вы пытаетесь настроить массивы char для хранения строк. Указатели не входят в это в этом пункте. Вы хотите:
char r[MAX_SUBSTRING];
char l[MAX_SUBSTRING];
, предполагая, что MAX_SUBSTRING достаточно велик, чтобы включить все символы, которые вы когда-либо попытаетесь вставить в них + 1 для нулевого терминатора. Вы должны включить + 1.
В следующей части пропущен нулевой терминатор, поэтому вы хотите:
int i,j;
for(i = 0; i<index; i++){
l[i] = string[i];
}
l[index] = '\0';
В следующей части для r отсутствует нулевой терминатор и индексирование отключено.
for(j = index; j<size;j++){
r[j - index] = string[j];
}
r[size-index] = '\0';
}
Теперь это должно решить проблему со строками, но есть и другие проблемы. Во-первых, два параметра (левый и правый) никогда не используются. Во-вторых, переменные r и l являются локальными для функции и перестают существовать, когда она заканчивается. Это означает, что ваша функция фактически не работает. Я предполагаю, что цель состояла в том, чтобы l и r действительно определялись вызывающими этой функцией (а не внутри нее) и передавались в функцию в качестве левого и правого параметров. Далее, что эти параметры должны были использоваться в функции, где в настоящий момент находятся l и r.