話說字串處理在C語言是很常用的,在使用時要注意的地方很多。一般在複製字串不外以下幾個function:

memcpy/strncpy/snprintf

各有其使用時機。strncpy看起來多一個n來指定複製長度,以避免overflow,乍看之下是很安全的,但結束符號常常是一個問題,導致結果和預期的不符。請見以下範例

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){

char ff2[4];
memset(ff2, 0, 4);
memcpy(ff2, "test", 4);
printf("memcpy: %s, len: %d\n", ff2, strlen(ff2));
strncpy(ff2, "test", 4);
printf("strncpy: %s, len: %d\n", ff2, strlen(ff2));
snprintf(ff2, 4, "%s", "test");
printf("snprintf: %s, len: %d\n", ff2, strlen(ff2));
return 0;
}

 

宣告一個4bytes的array,並且各自複製了4個bytes,是否很合理呢?

執行結果如下

memcpy: test��, len: 8
strncpy: test��, len: 8
snprintf: tes, len: 3

字串是需要結束符號的,因此複製完,要取用時就會發現結果與字串不符,比如說strlen或其他字串相關function。

現在比較長用snprintf了,避免沒有結束符號的問題。snprintf會加上結束符號,然後複製相對應的長度。

kezeodsnx 發表在 痞客邦 PIXNET 留言(0) 人氣()