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