home > 写経編 > 柴田望洋『明解C言語 入門編』 > 11. 文字列とポインタ >

ForNext

Only Do What Only You Can Do

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

VBScript

JScript

Perl

PHP

Python

Ruby

PowerShell

Scala

F#

C

更新日 : 2010.10.08
#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

C++

C++Builder

VC++

C#

Java

Objective-C

D

VB

VB.NET

Delphi

更新日 : 2010.09.24
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

Ada

PL/SQL

T-SQL

関数型

inserted by FC2 system