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. $