このブログを検索

2022/03/13

strcpy

あるソースコードが以下のようになっていた。

#include <stdio.h>

int main(void)
{
        char dstaddr[] = "192.168.55.2";
        char srcaddr[] = "192.168.55.1";
 ....

宛先アドレス、送信元アドレスを引数で渡したいと思い、

int main(int argc, char *argv[])
{
        char dstaddr[] = argv[1];
        ...

などとやってみたがdstaddrにargv[1]の値が代入されない。

*dstaddr = *argv[1];

とすると、最初の一文字だけしか代入できない。

結論を言うと、strcpyでコピーすればよい。

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

int main(int argc, char *argv[])
{
        char dstaddr[];
        strcpy(dstaddr, argv[1]);
        ...

argvは文字型変数へのポインタの配列である。 dstaddr[]は文字型変数の配列である。

printf("arg1: %s\n", argv[1]);

とすると、ちゃんと引数に指定した値が文字列として、例えば hello とか、

表示されるので、あたかもargvという変数に文字列が格納されているかと思ってしまうが、

これはprintfが内部でヌルが出現するまでargvのアドレスをインクリメントして表示しているのである。

strcpyという関数も、ポインタあるいは配列をインクリメントして1文字ずつコピーしているだけである。


strcpyを自分で書いてみる

#include 

void mystrcpy(char *s, char *t)
{
    while (*s++ = *t++)
        ;
}

int main(int argc, char *argv[])
{
        char addr1[] = "192.168.1.2";

        printf("addr1: %s\n", addr1);

        printf("arg1: %s\n", argv[1]);

        printf("copy arg1 to addr1\n");

        mystrcpy(addr1, argv[1]);
      
      printf("addr1: %s\n", addr1);
}

実行結果

# ./a.exe 172.16.1.5
addr1: 192.168.1.2
arg1: 172.16.1.5
copy arg1 to addr1
addr1: 172.16.1.5

参考: 「プログラミング言語C」 カーニハン/リッチー

https://atmarkit.itmedia.co.jp/ait/articles/1703/01/news170.html