0

私はこのコードを持っています:

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

        int main()
        {
         char buf[255];
         char buf2[255];
         char myhost[255] = "subdomain.domain.com";

         char *pch;
         int token_counter = 0;

         memset(buf, 0, 255);
         memset(buf2, 0, 255);
         pch = strtok(myhost, ".");
         while (pch != NULL)
           {
                pch = strtok(NULL, ".");
                if (pch == NULL)
                   {
                        memset(buf, 0, 255);
                        strncpy(buf, buf2, strlen(buf2) - 1);
                        break;
                   }
                token_counter++;
                strcat(buf2, pch);
                strcat(buf2, ".");
           }
         printf("Domain: %s\n", buf);
         return 0;
        }

myhostがsubdomain.domain.comとして定義されている場合、これは正常に機能していますが、domain.comの場合、最終結果として「com」が表示されます。

サブドメインなのかドメインなのかを正しく検出するにはどうすればよいですか?既知のTLDのリストを含めるとしたらどうでしょうか。

4

2 に答える 2

1

strtokやり過ぎでstrcat無駄です。n番目以降のすべてを印刷する場合は、文字列を.使用するstrchrか、文字列を調べてn番目を見つけます.。必要に応じて、文字列の末尾から数えます。

ここでなぜstrcat時間の無駄なのか説明させてください。検討:

const char *name = "foo.bar.baz.qux.net";
printf( "%s\n", name + 8 );

「baz.qux.net」を印刷する場合は、目的の文字列の最初の文字へのポインタがすでにあるため、その文字列を新しいバッファにコピーする必要はありません。あなたが持っているものを使用してください。あなたがする必要があるのは.、文字列内の目的へのポインタを見つけてから、printf( "%s\n", dot + 1 )またはを実行することputs( dot + 1 )です。(putsここの方が良いですが、おそらくあなたはもっとよく知っているでしょうprintf

于 2013-01-12T12:58:21.383 に答える
1

それがサブドメインであるかどうかを判断するには、ホスト名でピリオドで区切られたトークンの数を数えます。上記のコメントで指摘されているように、これはfoo.on.caのようなものを考慮に入れていません。

于 2013-01-12T12:56:22.707 に答える