Создать строку из char[] в c возвращает неправильное значение

У меня есть следующий код, который объявляет char data[] с простыми данными JSON. ({"x":123,"y":137}) 17 символов.

Затем в моей основной функции я пытаюсь скопировать char data[] char за char и объединить в новую строку, используя функцию strcat.

Когда я печатаю символ, который хочу объединить, он кажется допустимым символом, но когда я печатаю окончательную строку, это неправильно.

Код:

#include <stdio.h>
#include <string.h>

int getDataLength(){
    return 17;
}
static char data[] = {'{','"','x','"',':','1','2','5',',','"','y','"',':','1','3','7','}'};
char getData(int i){
    return data[i];
}

int main() {
    int dataLength = getDataLength();
    char data[dataLength + 1];
    for(int i=0 ; i < dataLength ; i++){
        char chr = getData(i);
        // --- looking good ---
        printf("%c",chr);
        strcat(data,&chr);
    }
    data[dataLength] = '\0';
    // --- broken string ---
    printf("\n%s",data);
}

Выход:

{"x":125,"y":137}
(���{"x":1% 

Что мне не хватает?


person Shlomi Schwartz    schedule 09.04.2018    source источник
comment
Более простым способом инициализации data[] будет static char data[18] = "{\"x\":123,\"y\":137}";. Обратите внимание, что этот массив состоит из 18 байтов, а не из 17; вам нужен дополнительный байт для нулевого терминатора в конце.   -  person r3mainer    schedule 09.04.2018
comment
@MFisherKDX спасибо за ваш вклад, я разобрался с инициализацией данных[0]. как я могу объединить char за char?   -  person Shlomi Schwartz    schedule 09.04.2018
comment
Не связано: в дополнение к первому комментарию: sizeof(data); дает... размер массива data; это намного элегантнее, чем возвращать жестко запрограммированный 17. Инициализация может быть выполнена с помощью static char data[] = "{\"x\":123,\"y\":137}".   -  person Jabberwocky    schedule 09.04.2018


Ответы (1)


Вы должны посмотреть на предупреждения вашего компилятора.

strcat(data,&chr);

strcat ожидает две строки в качестве параметров. Ваш второй параметр - это не строка, а только один символ. Нуль-терминация отсутствует, и вы копируете случайные мусорные данные.

Кроме того, вы не инициализируете data до того, как начнете добавлять к нему.

Обе ошибки вызывают неопределенное поведение в вашей программе.

person Gerhardh    schedule 09.04.2018
comment
Понятно, но как я могу соединить этот символ со строкой данных? - person Shlomi Schwartz; 09.04.2018
comment
А как насчет data[i] = chr; ? - person Gerhardh; 09.04.2018