2017-12-10 8 views
1

は、だから私は、文字列を持っている「127.0.0.1:1024scanf()を使用して文字列 "127.0.0.1:1024"を "127.0.0.1"と "1024"に分割する方法はありますか?

私は1024から127.0.0.1を分割したいです。これは私が試したことです:

char server[2048], port[2048]; 
int scanErr = sscanf(argv[1], "%[^:]2047s:%2047s", server, port); 

127.0.0.1が正しく取得されますが、ポートはまだ空です。何が問題なの?あなたは%[]後、余分な情報は必要ありません

+2

[この 'scanf'(および家族)のリファレンス](http://en.cppreference.com/w/c/io/fscanf)。 '%['の書式が間違っています。 –

+2

また、 'strtok'を検討してください – enhzflep

+0

* sscanfの使い方... *そうではありません。 [重大なバグを導入することなく使用するには、 'scanf()'関数ファミリは非常に難しい](http://c-faq.com/stdio/scanfprobs.html)です。 –

答えて

3

sscanf(argv[1], "%15[^:]:%5s", server, port); 

プラス、私は本当にあなたが彼らのためにそのくらいのスペースが必要とは思わない:

char server[16], port[6]; 
+0

また、ポート番号を文字列ではなく、符号なし16ビット整数にスキャンします。 – alk

+0

@alkクールな動き!しかし、アトールの家族はどうですか? – iBug

+1

'atoX'ファミリを使用しないでください。変換が行われることを確認する方法は絶対にありません。代わりに 'strtoX'ファミリを使用してください。 –

3

この特定のタスクがありますstrsepで最もよく実行され、sscanfではありません。 (。。*scanf機能のすべてが壊れ-指定されているよう-本当に、はいと何のために使用すべきではありませんされている)私はこのような何かをしたい:

char *server_with_port, *server, *port, *p; 

server_with_port = strdup(argv[1]); // writable copy required 
if (!server_with_port) { 
    perror("strdup"); 
    return 1; 
} 

p = server_with_port; 
server = strsep(&p, ":"); 
port = strsep(&p, ":"); 
if (!server || !port || p) { 
    fprintf(stderr, "%s: could not parse '%s'\n", argv[0], argv[1]); 
    usage(argv[0]); 
    return 1; 
} 

// now use 'server' and 'port' 
// free only 'server_with_port' when finished 

strsepは、BSDの拡張で最も近代的なていますUnixesが提供します。もしあなたがそれを持っていなければ、1999年のC標準の一部であるstrtok_rは、同じ機能を洒落たインターフェースで提供します。 でない場合、元のC標準の一部であるstrtokは同じ機能を提供しますが、より堅牢でスレッドセーフではないインターフェイスでもあります。

strdupもともとBSD拡張ですが、POSIX.1-2001で標準化されています。

関連する問題