2010-09-26 75 views
0

我正在從包含人名的文件中讀取一行,第一行包含男性的名字,而第二行包含女性的名字。然後我想把這些名字存儲在兩個數組中,一個是男性,一個是女性,然而當我印刷它們時,我會得到奇怪的東西。我不知道如果我不讀他們正確,或打印錯誤在C中打印字符指針 - 我越來越不好格式化

char line[100];  //holds line read 
    char *item;   //item in a line 
    char *item2; 
    int participants = 5; //number of people in the event 

      char* maleNames[participants]; 
      char* femaleNames[participants]; 

      fgets(line, 255, file); 
      int i; 
      item = strtok(line, " "); 
      for(i=0; i<participants; i++) 
      { 
       maleNames[i] = item; 
       item = strtok(NULL, " "); 


       } 

     //read female names now 
     fgets(line, 1024, file); 
     item2 = strtok(line, " "); 
     for(i=0; i<participants; i++) 
     { 
      femaleNames[i] = item2; 
      item2 = strtok(NULL, " "); 
     } 

這些行讀

John Jeffrey Adam Mark Peter 
Jenny Alice Sally Wendy Amanda 

然而,當我打印出來是這樣的:

 for(i=0;i<participants;i++) 
     { 
      printf("%s %s\n", maleNames[i], femaleNames[i]); 
     } 

我得到如此不同的東西:

Jenny Jenny 
Alice 
ally Sally 
Wendy Wendy 
Amanda 

注意:如果我在閱讀女性名字之前先閱讀了男性名字,那麼他們會正確打印。

回答

1

不關注其他問題(如大小255和1024,您傳遞給fgets當你的緩衝區只有100個字符長時),這個問題很可能來自於你對兩個fgets()的調用使用相同的緩衝區char line [100]。 Strtok返回一個指向行緩衝區中字符的指針,所以當你存儲在「行」中的女性名字時,所有這些指針相對於當行包含男性名字時行,現在是無效的。嘗試將母線存儲在其他緩衝區中,它應該可以工作。

編輯:對不起,如果「不注意......」聽起來令人沮喪。沒有什麼比我的意圖更遠了。每個人每次都會犯錯,特別是在學習時。祝你好運的過程:)

2

首先(和無關):你宣佈linechar[100];但是,您正在使用fgets(line, 1024, file)fgets(line, 255, file) - 這些緩衝區溢出等待發生。

接下來,確定讀取令牌時會發生什麼。例如,我會這樣做:

for(i=0; i<participants; i++) 
{ 
    maleNames[i] = item; 
    printf("Token %d: %s", i, item); 
    item = strtok(NULL, " "); 
} 

如果您在輸入或輸出中遇到問題,將會通知您。或者,使用調試程序遍歷循環,並確切看到發生了什麼。

此外,我相信你需要將strtok的返回值複製到另一個字符數組中。看看strdup複製你的字符串。

1

正如@lacqui已經提到的那樣,您有潛在的緩衝區溢出。我改變了fgets傳遞sizeof(line1)-1而不是硬編碼值。這樣編譯器就會計算出要傳遞的數據大小,即使你後來決定增加/減少緩衝區大小。減1是因爲fgets不會在最後覆蓋空終止符。我也使用memset初始化緩衝區。

我還添加了另一條線路緩衝區,因爲strtok的修改在該字符串替換爲null,指定的分隔符字符,並返回一個指向標記位置字符串... strtok的不進行復印。

除了空格之外,我更改了分隔符以包含\ r和\ n。

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

int main() { 
    char line1[100];  //holds line read 
    char line2[100]; 
    char *item;   //item in a line 
    char *item2; 
    const int participants = 5; //number of people in the event 

    char* maleNames[participants]; 
    char* femaleNames[participants]; 

    FILE* file = fopen("names.txt", "r"); 

    memset(line1, 0, sizeof(line1)); 
    fgets(line1, sizeof(line1)-1, file); 

    int i; 
    item = strtok(line1, " \r\n"); 
    for(i=0; i<participants; i++) 
    { 
     maleNames[i] = item; 
     item = strtok(NULL, " \r\n"); 
    } 

    //read female names now 
    memset(line2, 0, sizeof(line2)); 
    fgets(line2, sizeof(line2)-1, file); 

    item2 = strtok(line2, " \r\n"); 
    for(i=0; i<participants; i++) 
    { 
     femaleNames[i] = item2; 
     item2 = strtok(NULL, " \r\n"); 
    } 

    for(i=0;i<participants;i++) 
    { 
     printf("%s %s\n", maleNames[i], femaleNames[i]); 
    } 

    return 1; 
} 
+0

你應該傳遞'sizeof(line1)'而不是'sizeof(line1)-1'。閱讀'fgets'的文檔 – user102008 2010-12-22 00:19:04