2015-09-01 2 views
2

Я использую C. В этом примере предположим, что char buf всегда заканчивается на «,» (который у меня нет контроля), и мы всегда хотим усечь последние два символа (например, удалить «,») , Также предположим, что он не будет превышать 128 символов. Является ли приведенный ниже код безопасным (с этими предположениями)?C - Этот укороченный массив символов безопасен?

char buf[128]; 
sprintf(buf, "Item One, Item Two, Item Three, Item Four, "); 

int len = strlen(buf); 
if (len > 2) 
{ 
    // We know it's greater than 2, lop off the last two characters 
    buf[len - 2] = '\0'; 
} 

Если это не безопасно, что это лучший способ укоротить последние несколько символов, оканчивающихся нулем массив символов?

+1

Это довольно распространенная техника. Многобайтовые наборы символов могут сделать его небезопасным, но тогда вы не будете использовать 'strlen()'. – Sneftel

+0

Хорошая точка. В этом случае он не будет использовать Unicode. –

+3

Предложите 'size_t len', а не' int len'. Это тип, возвращаемый 'strlen()'. – chux

ответ

4

Да это безопасно, поскольку из-за утверждения if вы не можете получить доступ к памяти, которой вы не являетесь. Однако я бы изменил len на тип size_t, который является типом возврата strlen().


Кроме того, я хотел бы изменить, если заявление if (len >= 2) для того, чтобы позаботиться о том случае, когда только символы, которые вы хотите, чтобы отрезать появляются в buf. Таким образом, усеченная строка будет пустой строкой (поскольку ограничитель строки будет помещен в позицию 0).

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