2013-01-12 104 views
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列表?

+0

這與正則表達式有什麼關係?你只是在一個字符上進行標記 – Mark

+0

我以前用其他編程語言的正則表達式來做這件事,我認爲在c –

+0

中有類似的東西,但是這不是你的問題請求 – Mark

回答

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

+0

你的論點是非常有用的,我會盡快考慮如何做到這一點:) –

1

確定它是否爲子域計數主機名稱中由句點分隔的令牌數量。正如在上面的評論中指出的那樣,這並沒有考慮foo.on.ca這樣的東西。

+0

我很樂意這樣做,但我在本地c有點nb。只是想修改一些東西。 C不是我當前的編程語言 –

+0

您的token_counter變量中包含計數。 –