2016-11-03 46 views
2

我有以下結構:Ç - 寫入字符數組到一個文件中

struct visitordata { 
    char name[25]; 
    char email[25]; 
    int id; 
    char reg_time[9]; 
}; 

我想從這些遊客數據寫入到文件中。我是從CLI閱讀本數據:

int main(int argc, char** argv) 
{ 
    struct visitordata mydata; 
    char name[25], email[25], eventid[10], c; 
    printf("Enter name: "); 
    scanf("%s", name); 
    strcpy(mydata.name, name); 
    //etc. 
} 

現在,當我嘗試寫入文件:

lseek(handle, -sizeof(mydata.name), SEEK_END); 
fputs(handle, &mydata.name); 

這會將用戶好嗎給輸入,還有些莫名其妙,因爲我分配char name[25]

如何從命令行讀取後分配char數組大小?我對此很新,請不要苛刻。謝謝!

+1

您只爲該名稱保留25個字符。如果用戶輸入的時間更長,那麼你寫入的內存不是你的(緩衝區溢出)。在你的結構中,你可以使用'mydata.name = new char(strlen(name)+1)'來分配動態長度字符串。但你也應該保證,不要從'name'中讀取更多的字符,因爲你首先爲它保留字符。例如。通過使用'strncpy'而不是'strcpy'。也許保留一點點不止25個字符。還要確保字符串'\ 0'已終止。 – cwschmidt

+0

如果可以的話,你不應該用C來完成這些任務,因爲你有足夠的機會在腳下射擊自己。考慮Java或Go,它們可以保護您免受緩衝區溢出和其他內存損壞,格式化字符串攻擊,堆分配錯誤等等。一旦你獲得了更多的經驗,如果你真的想要,你可以切換到C. –

+1

我必須在C ... –

回答

-2

使用strlen(name)來獲取名稱中有多少個字符。

+0

自從我聲明它是'char name [25]'以來就有25個了。 –

+0

錯了。如果'name'不是空終止的,'strlen()'不會返回正確的長度。最好強制'scanf()'只接受25個字符,包括空終止符。 – alvits

0
struct visitordata mydata; 

memset(mydata, 0, sizeof mydata); 

if (scanf("%24s %24s", mydata.name, mydata.email) == 2) { 
    ... 
} 

memset填充mydata00字節,這樣你的文件不包含隨機數據。

將一個數組傳遞給一個函數時,只有一個指向它的第一個元素的指針才真正被傳遞,這正是scanf所期望的。請注意,對於閱讀int,您必須編寫:

if (scanf("%d", &mydata.id) == 1) { 
    ... 
} 
+0

在這種情況下,您不想用空值填充整個結構。那裏有一個整數!另外,你的sizeof語法是錯誤的。您需要將mydata包裝在圓括號中。 – Doug

+0

我刪除了我的評論,以避免誤導未來的讀者。 – alvits

+0

C++是無關的,但文檔只存在於C++中。我很想找到相應的C文檔。 – alvits

相關問題