2018/03/17

[c/c++]sscanf()でSSHっぽい名前を読む

C言語の標準ライブラリで文字列をパースしようとしたら、sscanf()が候補に出てくると思う。

数字のCSV形式を読むのに使っていて動いていたのだが、文字列をやろうとしてつまづいたので、記録を残しておこう。


01: #include <stdio.h>
02: #include <stdlib.h>
03: 
04: int main(void)
05: {
06:     const char STR[] = "yoshio@192.168.0.1:1234";
07:     char name[20] = "";
08:     char ipaddr[15 + 1] = "";
09:     int port = -1;
10:     int ret = sscanf(STR, "%s@%s:%d", name, ipaddr, &port);
11:     printf("ret=%d\n", ret);
12:     printf("name=%s\n", name);
13:     printf("ipaddr=%s\n", ipaddr);
14:     printf("port=%d\n", port);
15: }

ret=1
name=yoshio@192.168.0.1:1234
ipaddr=
port=-1


こうすると、期待通りになった。

01: #include <stdio.h>
02: #include <stdlib.h>
03: 
04: int main(void)
05: {
06:     const char STR[] = "yoshio@192.168.0.1:1234";
07:     char name[20] = "";
08:     char ipaddr[15 + 1] = "";
09:     int port = -1;
10:     int ret = sscanf(STR, "%[^@]@%[^:]:%d", name, ipaddr, &port);
11:     printf("ret=%d\n", ret);
12:     printf("name=%s\n", name);
13:     printf("ipaddr=%s\n", ipaddr);
14:     printf("port=%d\n", port);
15: }

ret=3
name=yoshio
ipaddr=192.168.0.1
port=1234

「文字列の中にデリミタの文字は入ってませんよー」という宣言がいる、ということかな。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。