2015-11-11 5 views
-2

Я выполняю компонентный тест для кода «C». Я прочитал функциональность функции strtok_r, но я не могу получить возвращаемое значение, которое я хочу передать в strncmp 'function. Мой код содержит strtok_r и strncmp функции, как показано ниже:Как функция strtok_r возвращает значения?

typedef struct BufferN { 
    uint32_t v; 
    uint32_t m; 
} My_Buffer; 

char subsystemstr[64] = { '\0' }; 
My_Buffer buffer; 
char *p_system; 
char *p_subsystem; 

(void) GetString(&buffer, subsystemstr, sizeof(subsystemstr)); 
p_system = strtok_r (subsystemstr, ":", &p_subsystem); 

for (i = 0u; i < 100; i++) 
{ 
    if (strncmp(p_system, "all", 64) == 0) 
    { 
     /*Some Code Statement*/ 
    } 
} 

Поскольку массив subsystemstr инициализируется «\ 0», я изменение этого значения массива с помощью функции GetString как ниже:

strncpy(subsystemstr, "all:", 64); 

Когда я печать subsystemstr, я обновив массив как:

["all:", '\0' <repeats 59 times>] 

, но когда я печать p_system (возвращаемое значение strtok_r). Я получаю

[0x388870 ""] 

Я смущен, как это работает. На самом деле, я хочу значение p_system = «все», так что функция «strncmp» может return 0. Прошу предложить.

+1

Добавить 'Е ("subsystemstr =% s \ п", subsystemstr) ; 'после' GetString' и перед вызовом 'strtok' и' printf ("p_system =% s \ n", p_system); 'после' strtok'. Что он выводит? – dbush

+0

Он дает тот же результат мне ["all:", '\ 0' <повторяет 59 раз>] и [0x388870 ""] – AshA

+1

@AshA: 'printf (" p_system =% s \ n ", p_system)' не будет печатать '[0x3888770" "]' :) Однако было бы полезно иметь 'printf (" subsystemstr =% p; p_system =% p \ n ", subsystemstr, p_system);' чтобы понять, что p_system указывает на. Наконец, 'strncmp' не нужно здесь (если вы не подозреваете, что можете перегрузить подсистему перераспределения str, и вам следует избегать этого :) :) и ни strncmp', ни' strcmp' не вернут 0 при сравнении «all:» с "все". (если вы не сравните 3 символа с помощью 'strncmp (..., 3);') – rici

ответ

1

Я подозреваю, что ваше понимание того, что

p p_system 

фактически делает (печатает адрес p_system)
в GDB, команда будет

p *p_system 

или, используя команду встроенной PRINTF

printf "%s", p_system 

или, используя C functio п

call printf("%s", p_system) 

или

call (void)puts(p_system) 

или, если вы не возражаете также видеть некоторые значения адресов

x /s p_system 
+0

ваш предложение действительно работает для меня, чтобы получить значения p_system. Благодарю. – AshA

Смежные вопросы