我正在尝试使用带* char的函数。
//the function
void init_player(struct player *_player, int pos_x, int pos_y, char *sprite){
printf(" %s",sprite);
_player->pos_x = pos_x;
_player->pos_y = pos_y;
strncpy(_player->player_sprite, sprite, sizeof(100));
}
当我在使用功能之前打印该功能时,它是可以的。
//the call
struct player array_player[3];
char *str = "img/dragon_verde.bmp";
printf("%s",str);
init_player(array_player[0],0,0,str);
以下是打印结果:
Before function: img/dragon_verde.bmp
After function : )!Sjdnm
(功能之后的东西,不能复制它)
我希望你能理解我的英语。
答案 0 :(得分:3)
此:
strncpy(_player->player_sprite, sprite, sizeof(100));
毫无意义,sizeof(100)
将评估为sizeof (int)
,在大多数常见平台上可能为4。也许你想到了(size_t) 100
,它将整数100转换为第strncpy()
个第三个参数的正确类型:虽然这是非常多余的,你不应该这样写。只需相信从int
隐式转换size_t
到100
这样的值就可以了。
编写它的正确方法,如果player_sprite
是一个字符数组(即char player_sprite[100];
声明中有类似struct player
的内容,则为:
strncpy(_player->player_sprite, sprite, sizeof _player->player_sprite);
否则你需要找到另一种方法来获得适当的缓冲区大小。
答案 1 :(得分:2)
你有问题:
init_player(array_player[0],0,0,str);
应该是:
init_player(&array_player[0],0,0,str);
请注意,如果您已启用编译器警告(并注意它们),您会立即注意到错误。
答案 2 :(得分:0)
sizeof(100)
不等于值100
。它是sizeof int
4
。
当您在strncpy中使用部分副本时,您应该在结尾处手动附加'\0'
,否则会导致未定义的行为。
根据您的需要适当改变大小。正如其他unwind说的那样,当你调用函数时,使用sixeof复制到字符串或发送要复制的字符数(作为参数之一)
Check this它将介绍如何使用strncpy。