strncpy関数は、文字列を指定された長さだけコピーします。コピー元とコピー先は重なってはいけません。

#include <string.h>
char *strncpy(char *dest, const char *src, size_t n);

*destはコピー先の文字列を指定します。
*srcはコピー元の文字列を指定します。
nはコピーする長さをバイト単位で指定します。

戻り値として、第1引数*destのアドレスを返します。

コピー元(*src)のn文字中にヌル文字(’\0’)が無い場合、コピー先(*dest)の終端にヌル文字は入りません。また、コピー元(*src)がn文字より短い場合は、コピー先(*dest)の残りの全てにヌル文字が入ります。

プログラム 例

#include <stdio.h>
#include <string.h>
#define BUFF_SIZE    1024
#define DATA_MAX     10
#define DATA_LENGTH  7

char *StrChomp(char *);

int main()
{
  char    buff[BUFF_SIZE];
  char    data[DATA_MAX][DATA_LENGTH];
  int     data_cnt;
  int     print_cnt;

  for (data_cnt = 0; data_cnt < DATA_MAX; ++data_cnt) {
    printf('文字列を入力してください(endで終了) ==> ');
    fgets(buff, BUFF_SIZE, stdin);
    StrChomp(buff);

    if (strcmp(buff, 'end') != 0) {
      /* 入力した文字列を2次元配列に格納 */
      strncpy(&data[data_cnt][0], buff, DATA_LENGTH - 1);
      /* ヌル文字を付加 */
      data[data_cnt][DATA_LENGTH - 1] = '\0';
    }
    else {
      break;
    }
  }

  printf('\n入力した文字列を表示します\n');
  printf('ただし、%d文字より長いものは%d文字にしています\n',
                 (DATA_LENGTH - 1), (DATA_LENGTH - 1));
  for (print_cnt = 0;  print_cnt < data_cnt; ++print_cnt) {
    printf('%s\n', &data[print_cnt][0]);
  }

  return 0;
}

/* 改行削除 */
char *StrChomp(char *str)
{
  char   *str_p;;

  for (str_p = str; *str_p; ++str_p)
    ;

  if (*(str_p - 1) == '\n') {
    *(str_p - 1) = '\0';
  }

  return str;
}

例の実行結果

$ ./strncpy.exe
文字列を入力してください(endで終了) ==> hello.
文字列を入力してください(endで終了) ==> hi.
文字列を入力してください(endで終了) ==> good morning.
文字列を入力してください(endで終了) ==> bye.
文字列を入力してください(endで終了) ==> end

入力した文字列を表示します
ただし、6文字より長いものは6文字にしています
hello.
hi.
good m
bye.
$