Вы неправильно завершаете строки в key_word
и value_word
должным образом, и эта ошибка, по-видимому, распространяется.Этот цикл является проблемой:
for(j=0;j<key_length;j++){
key_word[j] = *colon;
colon++;
}
Он копирует key_length
символов в key_word
, но ни один из этих скопированных символов не является нулевым терминатором.Вы можете решить эту проблему, добавив один дополнительный байт к key_word
:
char key_word[key_length + 1];
Затем добавьте это после цикла for()
:
key_word[key_length] = '\0';
Также нет необходимости создаватькопии в finalkey
и finalvalue
(которые, во всяком случае, имеют неправильный тип - вот почему вам в конечном итоге понадобятся все эти уродливые приведения).Таким образом, в целом это будет выглядеть так:
char key_word[key_length + 1];
char value_word[value_length + 1];
for (j = 0; j < key_length; j++) {
key_word[j] = *colon;
colon++;
}
key_word[key_length] = '\0';
space++;
for(k = 0; k < value_length; k++) {
value_word[k] = *space;
space++;
}
value_word[value_length] = '\0';
dictionary_add(d, key_word, value_word);
Действительно, вы должны упростить эту функцию, используя средства из string.h
.Например, strstr()
позволит вам искать строку ": "
, которая разделяет ваш ключ и значение, а memcpy()
делает эквивалент этих циклов for()
:
int dictionary_parse(dictionary_t *d, char *key_value)
{
char *colon;
char *value;
int key_length = -1; //Default key length to check for failure
colon = strstr(key_value, ": ");
if (colon != NULL) {
key_length = colon - key_value; // Number of characters before the colon
value = colon + 2; // Value is portion of the string after ": "
}
if (key_length < 1) {
return -1;
}
char key_word[key_length + 1];
memcpy(key_word, key_value, key_length);
key_word[key_length] = '\0';
dictionary_add(d, key_word, value);
return 0;
}