1.scanf數組
scanf的調用格式爲:scanf("<格式說明字符串>",<變量地址>);函數
第2個參數必定是一個地址。spa
1.1輸入字符串:指針
char name[40]; printf("Enter your name:\n"); scanf("%39s",name);
格式字符串%39s表示:最大接受39個字符(+’\0’),第2個參數name,是數組名做爲指針使用,把地址傳進了函數,scanf()即可以更新變量的內容。code
1.2輸入數字字符串
int age; printf("Enter your age:"); scanf("%d",&age); printf("age:%d\n",age);
格式字符串爲%d,則接受的第二個參數爲一個int*指針。
get
數組越界問題:若是忘記限制讀取字符串的長度,用戶就能夠輸入遠遠超出程序空間的數據,多餘的數據會寫到計算機尚未分配好的存儲器中。緩衝區溢出頗有可能會致使程序出錯。編譯器
2.使用fgets輸入string
fgets和scanf同樣,接受char指針,不一樣的是,你必須給它最大長度:it
char food[5]; printf("Enter favorite food:"); fgets(food,sizeof(food),stdin);
第1個參數爲,接受指向緩衝區的指針,第2個參數爲,接收字符串的最大長度(包含’\0’),第3個參數爲輸入,stdin表示來自標準輸入流。
若是第1個參數不是數組,而是指針,則必須顯式地指定其長度。
scanf能夠輸入多個字段,fgets不能夠。
scanf遇到空格就會中止,fgets能夠接受空格。
3.字符串字面值不能更新。
當這樣聲明:
char *cards = 「JQK」;
計算機會在存儲器的常量段中建立」JQK」,而後將cards指針(棧中)指向這一常量段的地址。常量段的數據不能夠被更改。
若是想修改字符串,就複製它:
若是在存儲器的非只讀區段建立了字符串的副本,就能夠修改它的字符了。
char cards[] = 「JQK」;(用字符串初始化數組)
當聲明瞭一個cards的數組,而後把它設置成字符串字面值,cards數組就成爲了一個全新副本。cards再也不是一個指向字符串字面值的指針,而是一個嶄新的數組。
3.1 char cards[]的含義:
若是是普通的變量聲明,cards就是一個數組,並且必須當即賦值。
若是以函數參數的形式聲明,那麼cards就是一個指針,與char *cards是等價的。
爲了今後避免修改字面值的錯誤,咱們應該這樣作:若是想把指針設成字符串字面值,必須確保使用了const關鍵字。
const char *cards = 「some string」;
這樣一來,若是編譯器發現代碼試圖修改字符串,就會提示編譯錯誤。