C/C++

Почему не правильно записывается массив?(СИ)

код:
fscanf(in, "%s", divise); printf("%s", divise); - считывает первое слово (считывает правильно)
k = strlen(divise) - 1; printf("K %d \n", k); - вычисляем длину слово, отнимаем 1 тк слово оканчивается на запитую
char* key = (char*)calloc((k - 7), sizeof(char)); - выделяем память на наше искомое слово
if (insert_proverka(divise) != -1) { - это проверка что слово divise было правильно введено ( надо для программы)
i = 7; - тк divise= это 7 букв то наше искомое слово начинается с 7 ячейки
for (int q = 0; q < k - 7; q++) {
key[q] = divise[i]; - тут идет сама запись искомого слово в key
if (i == k) break; - точка остановки
i++;
}
}
input :
....divise=gps, ....
в ключ(key) должно записать полностью слово после 'divise= ' и до ','
а если вывести что записывается в ключ то получится : gps¤¤¤¤, откуда 4 последние цифры? и как это можно исправить
у тебя строка не терминирована, выделяй память под key на 1 байт больше.
А вообще, проще через strchr находить = и через strcpy копировать данные.
Неизвестно Неизвестно
Неизвестно Неизвестно
80 864
Лучший ответ
i = 7; - тк divise= это 7 букв то наше искомое слово начинается с 7 ячейки

Нельзя так жестко присваивать i = 7 как будто вы заранее знаете что все длины будут равны семи. А если все же знаете - зачем вычислять k = strlen...?

Если вы считали divice c длинной в 7 символов и слово хранится в ячейках
0,1,2,3,4,5,6 то какое слово будет начинаться с 7-мой ячейки? Предполагаю там
терминирующий ноль и возможно остатки других слов. А вы что предполагаете?

for (int q = 0; q < k - 7; q++) {

вы вроде предположили что k = 7 (или 6 если -1). Но проверка в цикле наткнется на
0 < 7-7 ? тоесть 0 больше нуля? Нет. Цикл даже не запустится.
Какой должен быть диапазон цикла от нуля до... чего?

key[q] = divise[i]; - тут идет сама запись искомого слово в key

и i и k связаны с длиной слова, зачем вводить эту проверку в цикл, который вроде как основан на ней же?
if (i == k) break; - точка остановки

i++;

}
Сергей Иванов
Сергей Иванов
51 416
транслагиционный берхит сломается вот потому что