あるソースコードが以下のようになっていた。
#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を自分で書いてみる
#includevoid 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