下面代码不能正确输出hello的选项为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
正确答案: B
struct data3_t *pData=(struct data3_t*)&str; printf("data:%s%s\n",str.data,(char*)(&(pData->data[0])));
struct data2_t *pData=(struct data2_t*)&str; printf("data:%s%s\n",str.data,(char*)(pData->data[0]));
struct data1_t *pData=(struct data1_t*)&str;printf("data:%s%s\n",str.data,(char*)(pData->data));
struct str_t *pData=(struct str_t*)&str; printf("data:%s%s\n",str.data,(char*)(pData->data));
一张图说明问题。
在编程中,需要关注snprintf()的两个问题:一是它的返回值,二是它的第二个参数。
看看下面这段代码的运行结果:
#include #include
int main() { int ret; char str[10];
printf("sizeof(str) = %d\n", sizeof(str));
ret = snprintf(str, sizeof(str), "%s", "abc"); printf("%d:%s => %d\n",strlen(str), str, ret);
ret = snprintf(str, sizeof(str), "%s", "1234567890"); printf("%d:%s => %d\n",strlen(str), str, ret);
ret = snprintf(str, sizeof(str), "%s", "1234567890X"); printf("%d:%s => %d\n",strlen(str), str, ret);
return 0; } |
以上代码运行结果为:
3:abc => 3 // 没有被截断,输出:abc 9:123456789 => 10 // 被截断了,没有输出:1234567890 9:123456789 => 11 // 同样被截断了,没有输出:1234567890X |
其中,snprinf的第二个参数是要把字符串中的\0算上,比如大小为5,hello那么拷贝的就是hell\0。
而返回值是指实际需要拷贝的字符串的大小,这里就为5,不包括\0的位置。