[問題] 關於fgets的問題

看板C_and_CPP作者 (Jun)時間15年前 (2010/10/29 12:00), 編輯推噓3(3015)
留言18則, 4人參與, 最新討論串2/2 (看更多)
#include<stdio.h> #include<stdlib.h> int main() { char str1[]=""; fgets(str1,10,stdin); system("pause"); } 我有兩個問題想請問,希望板上的高手能幫忙一下, 問題一 str1[]=""代表的是一個空陣列嗎?fgets是否一定只能讀入空陣列呢? 問題二 str1[]="",如果改成*str1為何執行會有問題呢? 我知道fgets的function大概的樣子,但是不了解比較detail的一些東西! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.70.194.103

10/29 12:02, , 1F
char str1[]=""; 是一個長度為1,內容只有\0的陣列
10/29 12:02, 1F

10/29 12:03, , 2F
這麼寫應該會有overflow問題
10/29 12:03, 2F

10/29 12:11, , 3F
A2: str1被宣告成指標 其內容指向""
10/29 12:11, 3F

10/29 12:21, , 4F
1.是 array access out of bounds 吧 XD
10/29 12:21, 4F

10/29 12:22, , 5F
2.這就像之前回答你的一樣...指到的那塊是唯讀的不能
10/29 12:22, 5F

10/29 12:23, , 6F
會出現overflow沒錯
10/29 12:23, 6F

10/29 12:23, , 7F
改值, 仔細看好fgets 他接受的引數是 const char*還
10/29 12:23, 7F

10/29 12:23, , 8F
是 char*, 雖然 char *str = "123" 這個 str 的型態
10/29 12:23, 8F

10/29 12:24, , 9F
是 char*, 但是它只能當 const char* 來操作, 所以我
10/29 12:24, 9F

10/29 12:24, , 10F
會要你這類的字串都用這種指標來接
10/29 12:24, 10F

10/29 12:28, , 11F
其實函式的prototype就會透露了他會做的動作, 傳址表
10/29 12:28, 11F

10/29 12:29, , 12F
示他會改到你的記憶體, 但是傳 pointer to const表示
10/29 12:29, 12F

10/29 12:29, , 13F
它只有藉由指標去讀值而已, 你連prototype都不清楚的
10/29 12:29, 13F

10/29 12:30, , 14F
話, 不能稱作「知道他大概的樣子喔」, 而且也可以算你
10/29 12:30, 14F

10/29 12:30, , 15F
沒有呼叫他的權利, 因為它所要的 precondition 你都不
10/29 12:30, 15F

10/29 12:31, , 16F
知道要怎麼確保
10/29 12:31, 16F

10/29 12:34, , 17F
http://ppt.cc/g;80 <= 這是fgets比較正確的範例
10/29 12:34, 17F

10/29 12:35, , 18F
請注意它用的是 char mystr[100]; 而非 char [] = "";
10/29 12:35, 18F
文章代碼(AID): #1CoaRGa0 (C_and_CPP)
文章代碼(AID): #1CoaRGa0 (C_and_CPP)