2013-11-18 2 views
1

В моем проекте я встретил эту странную проблему с strncpy. Я проверил reference. Но поведение strncpy меня смущает. В этом function, когда он работает в strncpy(subs,target,term_len);Странное поведение с функцией strncpy?

status of variables

Пока я не знаю, почему есть два холостых после строки? !!! Это большой проект, я не могу вставить весь код здесь. Следующее - это просто кусок. Весь мой код here.

char* subs = new char[len]; 
while(top<=bottom){ 
    char* term = m_strTermTable[bottom].strterm; 
    int term_len = strlen(term); 
    memset(subs,'\0',len); 
    strncpy(subs,target,term_len); 
    int subs_len = strlen(subs); 
    int re = strcmp(subs,term); 
    if (re == 0) 
    { 
     return term_len; 
    } 
    bottom--; 
} 
delete[] subs; 
+1

Если это C++ почему вы просто не используете 'std :: string'? – 111111

+0

strncpy делает ** не ** всегда добавляет нулевой терминатор. Это особенно глупая функция, которую я бы избегал использовать. – john

+1

Вы проверили значение 'term_len'? может быть, 'term_len' больше, чем' len'? – jcm

ответ

2

strncpy не добавляет завершающий нулевой байт, если исходная строка длиннее, чем максимальное количество символов (то есть в вашем случае, это было бы, если strlen(target) > term_len держит). Если это произойдет, subs может быть или не быть правильно завершен нулем.

Попробуйте изменить strncpy вызов

strncpy(subs, target, term_len-1); 

так, что даже если strncpy не добавляет завершающий нулевой байт, subs все равно будет нулевым байтом правильно из-за предыдущего memset вызова.

Теперь, что было сказано - вы могли бы избежать использования отдельного subs буфера в целом (что утечки в любом случае в случае поток управления получает в return заявление), используя только strncmp как в

while(top<=bottom) { 
    char* term = m_strTermTable[bottom].strterm; 
    int term_len = strlen(term); 
    if (strncmp(term, target, term_len) == 0) { 
     return term_len; 
    } 
    bottom--; 
} 
Смежные вопросы