Head First C學習日誌,第二章 用指針輸入數據

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」;

這樣一來,若是編譯器發現代碼試圖修改字符串,就會提示編譯錯誤。

相關文章
相關標籤/搜索