Поскольку вы печатаете
printf("%c", initialParts[l]);
Я могу предположить, что initialParts определяется как char *
, а затем динамически распределяется.
strtok
обычно используется для получения токенов различной длины , Даже если вы уверены, что исходные строки, разделенные запятыми, состоят из одного символа, при выполнении
strcpy(&initialParts[initialPartsCounter], token);
вы копируете в массив char как минимум два символа: символ токена (например, 'q') и терминатор строки '\0'
(строка является просто массивом символов с нулевым символом в конце, и все функции манипулирования строк полагаются на него).
Просто выполните
initialParts[initialPartsCounter] = *token;
Действительно, это была не главная ошибка. Фактически, даже несмотря на то, что он показывает некоторое недопонимание того, как работает strtok
, он будет работать до тех пор, пока в массиве initialParts
не останется места для хранения текущего символа и ограничителя строки.
Другая ошибка заключается в том, что хотя при разборе strtok
вы получаете только initialPartsCounter
символов, но вы печатаете все символы массива (numInitialParts
). Те, что в конце, будут бессмысленными, поэтому исправляя его, код будет работать, как и ожидалось.
В следующем примере ваш код встроен в простую основную функцию (я определил вручную входной файл `char fileLine [] =" q, d, c, k "):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char *initialParts, *token;
char fileLine[] = "q,d,c,k";
const char comma[3] = ",";
int initialPartsCounter = 0, numInitialParts = 20;
initialParts = (char*)malloc((int)numInitialParts * sizeof(char));
token = strtok(fileLine, comma);
while (token != NULL)
{
//strcpy(&initialParts[initialPartsCounter], token);
initialParts[initialPartsCounter] = *token; //Use this only if tokens are only one char long
initialPartsCounter++;
token = strtok(NULL, comma);
}
for (int l = 0 ; l < initialPartsCounter; l++)
{
printf("%c", initialParts[l]);
}
printf("*end\n");
free(initialParts);
return 0;
}
Я также напечатал закрывающую строку , чтобы показать, что в ней нет завершающего неожиданного символа. Выход
qdck*end