* char值改变了函数

时间:2014-04-03 10:13:37

标签: c string char

我正在尝试使用带* 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

(功能之后的东西,不能复制它)

我希望你能理解我的英语。

3 个答案:

答案 0 :(得分:3)

此:

strncpy(_player->player_sprite, sprite, sizeof(100));

毫无意义,sizeof(100)将评估为sizeof (int),在大多数常见平台上可能为4。也许你想到了(size_t) 100,它将整数100转换为第strncpy()个第三个参数的正确类型:虽然这是非常多余的,你不应该这样写。只需相信从int隐式转换size_t100这样的值就可以了。

编写它的正确方法,如果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。