2011-03-29 198 views
0

下面的代碼是縮寫形式,我有兩個名爲struct INTERFACE和struct node的結構體。 爲了我的目的,我有2個節點,第一個節點有兩個接口,第二個節點有三個接口。將值賦給struct數組的問題!

我有一個配置文件,我需要讀取信息並將其存儲在上述結構中。

所以在我的主程序while循環中,我分別使用strtok()fun和store來讀取配置文件。 在if循環中(if(strcmp((p,「IP_ADDR_ETH」)== 0),我比較了IP地址令牌並檢索了IP地址並存儲在每個節點的接口中。 NODE-1表示第一個節點,NODE-2裝置第二個節點。 這裏我只示出了爲第一個節點。

在如果環路I retrive第一節點的IP地址,並將其存儲在節點結構的接口的值。 由,

(node1[i].node_if[a].ip_addr)= p; 
           //strcpy((node1[i].node_if[a].ip_addr),p); 
         printf("Node[%d] interface-eth[%d] address=%s \n\n", i,a,(node1[i].node_if[a].ip_addr)); 

在while循環,對每個節點,我可以訪問界面結構,妥善得到IPADDR值。 但出於側while循環,如果我打印次e每個節點的接口值,我只得到第二個節點的最後一個接口值,我無法正確地獲得每個節點的接口ipaddress。

我的主代碼的部分如下,對不起,如果碼長爲更再,但我給僅僅nessary部,

/* Node information structure. */ 
typedef struct node { 
    char name[20]; 
    char val[20]; 
    char OS[10]; 
    int vm_id; 
    int num_if; 
    //char *OS; 
    if_val1 node_if[10]; 
    long int memsize; 
}node1; 

/* Interfaces definition structure. */ 
typedef struct INTERFACE { 
    char *ip_addr; 
    char *netmask; 
    char *gateway; 
} if_val1,if_val2; 

I have the above two structure. 


/* File pointer .*/ 
FILE *f; 


int main() 
{ 

    node1 nodeuse; 
    node1 node1[20]; 
    //if_val1 if_val[10]; 
    if_val1 zero_ifintf; 

    //int a; 
    f=fopen("test.config","r"); 
    if(!f) 
    return 1; 

    while(fgets(string, sizeof(string)-1, f) != NULL) 
    { 
     /* Break into tokens. */ 
     p = string; 
     p = strtok(string, seps); /* Find first token*/ 
     while(p != NULL) 
     { 
     if (strcmp(p,"NODE")==0) 
      { 

      a = atoi (strtok(NULL, seps)); /* Find next token*/ 
      switch (a) 
       { 
       case 1: 
       { 
       int i=0; 
       if(strcmp(p,"IP_ADDR_ETH")==0) 
         { 

          printf("--------------hi1 \n"); 
          int comp,a; 
          printf("------------hi2 \n"); 
          a = atoi (strtok(NULL, seps)); /* Find next token*/ 

          if(a < (node1[i].num_if)) 
          { 
           printf("-------------hi3 \n"); 
           p = strtok(NULL, seps); /* Find next token*/ 
           (node1[i].node_if[a].ip_addr)= p; 
           //strcpy((node1[i].node_if[a].ip_addr),p); 
         printf("Node[%d] interface-eth[%d] address=%s \n\n", i,a,(node1[i].node_if[a].ip_addr)); 
          } 

          printf("---------------------hi4 \n"); 
         } 
        i++; 
       } 
       }} //end of while loop 

     //outside while loop printf 's 

      printf("NODE[%d] INTERFACE-ETH-[%d] ADDRESS: %s \n",1,0,(node1[0].node_if[0].ip_addr)); 
      printf("NODE[%d] INTERFACE-ETH-[%d] ADDRESS: %s \n",1,1,(node1[0].node_if[1].ip_addr)); 
      printf("NODE[%d] INTERFACE-ETH-[%d] ADDRESS: %s \n",2,0,(node1[1].node_if[0].ip_addr)); 
      printf("NODE[%d] INTERFACE-ETH-[%d] ADDRESS: %s \n",2,1,(node1[1].node_if[1].ip_addr)); 
      printf("NODE[%d] INTERFACE-ETH-[%d] ADDRESS: %s \n",2,2,(node1[1].node_if[2].ip_addr)); 

爲什麼按預期不打印結構的值。

另外,我想分配標記字符串值到其他字符串使用strcpy()函數。但是當編譯分段錯誤出現時。是否可以使用strcpy()來聲明char *字符串並賦值?

我的配置文件,如下所示, [test.config]

TYPE VM vm1 
TYPE PM pm1 
NODES 2 
APS 2 
TYPE wired 
NODE-1 NUM_IF 2 
NODE-1 IP_ADDR_ETH-0 10.114.12.1 
NODE-1 IP_ADDR_ETH-1 10.114.12.2 
NODE-1 VM_ID 1 
NODE-1 MEM_SIZE 512 
NODE-1 OS FEDORA 

NODE-2 NUM_IF 3 
NODE-2 IP_ADDR_ETH-0 10.114.14.1 
NODE-2 IP_ADDR_ETH-1 10.114.14.2 
NODE-2 IP_ADDR_ETH-2 10.114.14.3 
NODE-2 VM_ID 2 
NODE-2 MEM_SIZE 1GB 
NODE-2 OS CENTOS 
NODE-2 10.114.12.7 

[/test.config]

謝謝

阿倫

+1

請花一些時間閱讀[*格式幫助*](http://stackoverflow.com/editing-help)。正確設置問題的格式,以便其他人有機會回答您。 – 2011-03-29 07:48:23

回答

0
strcmp(p,"IP_ADDR_ETH") 

永遠因爲此時p指向「NODE」。一旦你解決這個問題,它應該可以工作。