指定した文字数だけ、文字列をコピー

明解C言語 入門編 > 11. 文字列とポインタ >

指定した文字数だけ、文字列をコピー

C


#include <stdio.h>
#include <string.h>

char* str_ncpy(char* d, const char* s, size_t n)
{
char* t = d;

int j = 1;
unsigned i;
for (i = 0; i < n; i++)
{
if ((*s) && j)
*d++ = *s++;
else
{
j = 0;
*d++ = '\0'; /* \0 で 埋める */
}
}

return t;
}

int main(int argc, char* argv[])
{
int i;
char* st1 = "1234567890";
char* st2 = "ABCDE";

printf("st1 = %s\n", st1);
printf("st2 = %s\n", st2);
puts("");

str_ncpy(st1, st2, 4);
printf("st1 = %s\n", st1);
printf("st2 = %s\n", st2);
puts("");

str_ncpy(st1, st2, 6);
printf("st1 = ");
for (i = 0; i < 10; i++)
if (st1[i] == '\0')
putchar(' ');
else
putchar(st1[i]);
putchar('\n');
printf("st2 = %s\n", st2);
puts("");

st1 = "1234567890";
strncpy(st1, st2, 4);
printf("st1 = %s\n", st1);
printf("st2 = %s\n", st2);
puts("");

strncpy(st1, st2, 6);
printf("st1 = ");
for (i = 0; i < 10; i++)
if (st1[i] == '\0')
putchar(' ');
else
putchar(st1[i]);
putchar('\n');
printf("st2 = %s\n", st2);
puts("");

return 0;
}

実行結果


R:\>lesson086\project1.exe
st1 = 1234567890
st2 = ABCDE

st1 = ABCD567890
st2 = ABCDE

st1 = ABCDE 7890
st2 = ABCDE

st1 = ABCD567890
st2 = ABCDE

st1 = ABCDE 7890
st2 = ABCDE

Delphi


program Project1;

{$APPTYPE CONSOLE}

uses
SysUtils;

function str_ncpy(d:PChar; s:PChar; n:Integer):PChar;
var
i, j: Integer;
begin
result := d;

j:= 1;
for i := 0 to n - 1 do
begin
if s^ <> #0 then
begin
d^ := s^;
Inc(s);
Inc(d);
end
else
begin
d^ := #0;
j := 0;
break;
end;
end;

if j = 1 then
d^ := #0;
end;

procedure main();
const
st1: String = '1234567890';
st2: String = 'ABCDE';

pt1: array[0..255] of Char = '1234567890';
pt2: array[0..255] of Char = 'ABCDE';
var
i: Integer;
begin
Writeln(Format('st1 = %s', [st1]));
Writeln(Format('st2 = %s', [st2]));
Writeln('');

st1 := Copy(st2, 1, 4);
Writeln(Format('st1 = %s', [st1]));
Writeln(Format('st2 = %s', [st2]));
Writeln('');

st1 := '1234567890';
st1 := Copy(st2, 1, 6);
Writeln(Format('st1 = %s', [st1]));
Writeln(Format('st2 = %s', [st2]));
Writeln('');



Writeln(Format('pt1 = %s', [pt1]));
Writeln(Format('pt2 = %s', [pt2]));
Writeln('');

str_ncpy(pt1, pt2, 4);
write('pt1 = ');
for i := 0 to 9 do
if pt1[i] = #0 then
write(' ')
else
write(pt1[i]);
Writeln('');
Writeln(Format('pt2 = %s', [pt2]));
Writeln('');

pt1 := '1234567890';
str_ncpy(pt1, pt2, 6);
write('pt1 = ');
for i := 0 to 9 do
if pt1[i] = #0 then
write(' ')
else
write(pt1[i]);
Writeln('');
Writeln(Format('pt2 = %s', [pt2]));
Writeln('');



pt1 := '1234567890';
StrLCopy(pt1, pt2, 4);
write('pt1 = ');
for i := 0 to 9 do
if pt1[i] = #0 then
write(' ')
else
write(pt1[i]);
Writeln('');
Writeln(Format('pt2 = %s', [pt2]));
Writeln('');

pt1 := '1234567890';
StrLCopy(pt1, pt2, 6);
write('pt1 = ');
for i := 0 to 9 do
if pt1[i] = #0 then
write(' ')
else
write(pt1[i]);
Writeln('');
Writeln(Format('pt2 = %s', [pt2]));
Writeln('');



pt1 := '1234567890';
StrMove(pt1, pt2, 4);
write('pt1 = ');
for i := 0 to 9 do
if pt1[i] = #0 then
write(' ')
else
write(pt1[i]);
Writeln('');
Writeln(Format('pt2 = %s', [pt2]));
Writeln('');

pt1 := '1234567890';
StrMove(pt1, pt2, 6);
write('pt1 = ');
for i := 0 to 9 do
if pt1[i] = #0 then
write(' ')
else
write(pt1[i]);
Writeln('');
Writeln(Format('pt2 = %s', [pt2]));
Writeln('');
end;

begin
main;
end.

実行結果


S:\>lesson086\project1.exe
st1 = 1234567890
st2 = ABCDE

st1 = ABCD
st2 = ABCDE

st1 = ABCDE
st2 = ABCDE

pt1 = 1234567890
pt2 = ABCDE

pt1 = ABCD 67890
pt2 = ABCDE

pt1 = ABCDE 7890
pt2 = ABCDE

pt1 = ABCD 67890
pt2 = ABCDE

pt1 = ABCDE 7890
pt2 = ABCDE

pt1 = ABCD567890
pt2 = ABCDE

pt1 = ABCDE 7890
pt2 = ABCDE