Начинающий запрос на C струнных Jsmn Джейсон Парсер - PullRequest
0 голосов
/ 22 сентября 2018

Я начал с программирования на Golang, и все выглядело просто. Затем я наткнулся на анализатор JSON C ( JSMN ), чтобы я мог попробовать CGO.

Вот строки кода( 11 и 46 ) из этого примера :

static const char *JSON_STRING =
    "{\"user\": \"johndoe\", \"admin\": false, \"uid\": 1000,\n  "
    "\"groups\": [\"users\", \"wheel\", \"audio\", \"video\"]}";

printf("- User: %.*s\n", t[i+1].end-t[i+1].start, JSON_STRING + t[i+1].start);

Это дает мне результат:

"- Пользователь: johndoe"

Я новичок в C. Я хочу получить значение "johndoe" в переменной.Я попробовал ниже код, который дает мне NULL:

int c = 0;
char sub[1000];
while (c < (t[i+1].end-t[i+1].start) ) {
    sub[c] = JSON_STRING[t[i+1].start+c-1];
    c++;
}
sub[c] = '\0';

Вывод:

"- Пользователь: null"

Как я могу сделатьтот?Спасибо!

1 Ответ

0 голосов
/ 23 сентября 2018

Вы можете использовать strncpy () , чтобы скопировать необходимую строку в отдельную переменную, поскольку вы уже знаете длину и начальную точку строки, например:

t[i+1].end - t[i+1].start     // length of the string to copy
JSON_STRING + t[i+1].start    // starting point from where to start copying

Например,:

const char*  strStart  = JSON_STRING + t[i+1].start;
const size_t strLength = t[i+1].end - t[i+1].start;

const size_t length = 8;      // required to store "johndoe"
char strCopy[ length ] = { 0 };

strncpy( strCopy, strStart, strLength );
// You might need to null terminate your string
// depending upon your specific use case.

JSMN-анализатор сохраняет начальную и конечную позиции токенов.Пользователь библиотеки должен делать копии по мере необходимости, используя эти позиции.

%.*s спецификатор формата в printf() принимает ширину поля (длину строки для печати), предшествующую фактической строке в стиле Cв качестве аргументов.Для получения более подробной информации см. this .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...