天天看點

關于gets()函數和scanf()函數的差別

         gets()函數和scanf()函數都是編寫程式非常常用的函數,正因為它的常用,一些程式編寫人員往往忽略了其兩者的一些差別,這就造成了有時候程式運作錯誤,但是怎麼也找不到原因的現象,今天我們就看看它們究竟有什麼差別!

1.

非常明顯的一點:gets()隻能輸入字元串,scanf()功能相對就比較多了,隻要有相應的格式控制符,如%d,%c,%lf......,就可以輸入整型,字元型,浮點型等資料。

2.

         scanf()結束字元串的輸入可以用回車,空格,制表(tab 相當于好幾個空格)鍵,而gets()隻能用Enter鍵,這也說明了scanf()函數不能輸入空格,gets()則可以。看如下代碼和運作結果:

#include<stdio.h>

#include<string.h>

int main(void)

{

char a[100],b[100];

printf("gets()輸入:\n");

gets(a);

printf("scanf()輸入:\n");

scanf("%s",b);

printf("%d\n%d\n",strlen(a),strlen(b));

return 0;

}

關于gets()函數和scanf()函數的差別

可明顯看出gets()包含空格,而scanf()則到空格結束。

3.

         gets()函數可接收回車之前的所有字元,并把‘\0’替換為‘\n’,不會在緩沖區留下東西,而scanf()則是在輸入有效字元後在結尾加一個'\0',而輸入的結束标志(回車,空格,制表)會留在緩沖區中,也可以這樣了解,對于gets()來說,最後輸入的“\n”會變成‘\0’,而scanf()當輸入結束标志時,是把結束标志存到緩沖區中,然後再字元串後面加一個'\0'。看如下程式和運作結果:

#include<stdio.h>

#include<string.h>

int main(void)

{

char a[100],b[100];

printf("scanf()輸入:\n");

scanf("%s",a);

    printf("gets()輸入:\n");

gets(b);

printf("%d\n%d\n",strlen(a),strlen(b));

return 0;

}

關于gets()函數和scanf()函數的差別

為什麼是3和4呢???

        因為scanf()是以空格結束的,并且結束後的字元要存到緩沖區中,是以abc是scanf()中的有效字元3個,後面的字元'空格'+def+'回車'(注意,後面還有一個Enter鍵)則存到了緩沖區中,共5個字元,接下來又用gets()輸入,把緩沖區裡的東西‘空格’+abc+‘回車’輸入到了gets()中,當遇到回車的時候‘\n’變為‘\0’作為結束标志,是以最後輸出4。是以以後使用這兩個函數的時候,尤其是混合使用的時候要注意這種情況的發生。

        最後,還有一個相同點,其實已經說過了,就是當輸入完成的時候,數組中的最後一個字元都是'\0',是以有時候用到循環的時候,沒必要先用strlen()求字元的個數,而是直接用數組名[下标]!=‘\0’作為條件。

繼續閱讀