Это не инициализирует память:
int delimiterPosition[50];
Таким образом, его содержимое потенциально случайное (и его неопределенное значение для чтения, если вы не инициализируете его сначала). Итак, здесь:
if (delimiterPosition[x] > 0 ) // Is potentially invalid if x >= f
Легко решается с помощью:
int delimiterPosition[50] = {0};
Потенциал для переполнения здесь:
delimiterPosition[f] = x;
f++;
Вы не подтвердите это f
остается в правильном диапазоне (менее 50). Еще одно простое решение:
size_t stringLen = strlen(text); // Don't need to recalculate this each time!
for (int x = 0; f < 50 && x < stringLen; x++)
{
if (text[x] == delimiter)
{
delimiterPosition[f] = x;
f++;
}
}
Вот проблема, на которую вы жалуетесь:
for (int y = 0; y < delimiterPosition[0]; y++)
{
splitted[g][y] = text[y];
}
Вы копируете строку.
Но вы этого не делаете добавить терминатор к строке. Поэтому, когда вы попытаетесь распечатать его, вы увидите все дополнительные символы в конце.
for (int y = 0; y < delimiterPosition[0]; y++)
{
splitted[g][y] = text[y];
}
splitted[g][y] = '\0'; // Add string terminator.
Для второй следующей строки у вас есть проблема с нулевым терминатором. Но у вас также есть проблема, что вы копируете строку не в начало.
// After the first string the value of y in an offset into text only
// So when used with `splitted[g]` you are offset from the beginning
// if the string.
splitted[g][y] = text[y];
Также ваш тест на конец строки неверен:
Помните, что вы начинаете с:
int y = delimiterPosition[g - 1]
Итак, у - это смещение в строке. Поэтому при увеличении его всегда будет смещение, а не длина.
// So this test is wrong (you are using a length not an offset.
y < delimiterPosition[g] - delimiterPosition[g - 1]
Позволяет исправить оба значения одновременно:
int dstIndex = 0;
for (int y = delimiterPosition[g - 1]; y < delimiterPosition[g]; y++, dstIndex++)
{
splitted[g][dstIndex] = text[y];
}
splitted[g][dstIndex] = '\0';