2012-11-25 92 views
0

我試圖從一個文件分割像127.0.0.1一個IP地址:使用字符數組拆分IP與strtok的

下面的C代碼:

pch2 = strtok (ip,"."); 
printf("\npart 1 ip: %s",pch2); 
pch2 = strtok (NULL,"."); 
printf("\npart 2 ip: %s",pch2); 

和IP是一個char IP [500 ],包含一個ip。

打印時打印127作爲第1部分,但作爲第2部分打印NULL?

有人可以幫助我嗎?

編輯:

整體功能:

FILE *file = fopen ("host.txt", "r"); 
char * pch; 
char * pch2; 
char ip[BUFFSIZE]; 
IPPart result; 

if (file != NULL) 
{ 
    char line [BUFFSIZE]; 
    while(fgets(line,sizeof line,file) != NULL) 
    { 
     if(line[0] != '#') 
     { 
          pch = strtok (line," "); 
      printf ("%s\n",pch); 

      strncpy(ip, pch, strlen(pch)-1); 
      ip[sizeof(pch)-1] = '\0'; 

      //pch = strtok (line, " "); 
      pch = strtok (NULL," "); 
      printf("%s",pch); 


      pch2 = strtok (ip,"."); 
      printf("\nDeel 1 ip: %s",pch2); 
      pch2 = strtok (NULL,"."); 
      printf("\nDeel 2 ip: %s",pch2); 
      pch2 = strtok(NULL,"."); 
      printf("\nDeel 3 ip: %s",pch2); 
      pch2 = strtok(NULL,"."); 
      printf("\nDeel 4 ip: %s",pch2); 

     } 
    } 
    fclose(file); 
} 
+2

確定嗎?我無法重現錯誤。嘗試顯示ip的初始化。 – effeffe

+0

它怎麼能打印** NULL?你確定這個問題嗎? –

+0

我已經添加了整個代碼,我正在讀取一個主機文件。不知道如何可以打印null ...:s – user1480139

回答

2

你做一個

strncpy(ip, pch, sizeof(pch) - 1); 
ip[sizeof(pch)-1] = '\0'; 

這應該是

或更好,但只是

strcpy(ip, pch); 

因爲sizeof(pch) - 1sizeof(char*) - 1,這是一個32位機器上僅有3個字節。這對應於3個字符,即「127」,這符合你的觀察,第二個strtok()給出NULL。

+0

@ user1480139請參閱修改後的答案。 –

1

我用你的代碼如下,它爲我的作品

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

char ip[500] = "127.0.0.1"; 

int main() { 
    char *pch2; 
    pch2 = strtok (ip,"."); 
    printf("\npart 1 ip: %s",pch2); 
    pch2 = strtok (NULL,"."); 
    printf("\npart 2 ip: %s",pch2); 
    return 0; 
} 

執行

linux$ gcc -o test test.c 
linux$ ./test 

part 1 ip: 127 
part 2 ip: 0 
0

發現問題,Visual Studio將0添加到指針並且與NULL一樣...

+0

請看我的答案。 –

+0

我以爲我發現它與我的測試,但它does not工作。我編輯了代碼ey eyou說,仍然打印NULL – user1480139