c語言中get()函數的原理及返回值


轉載自CSDN博客:http://blog.csdn.net/shenglanya/article/details/52213500

 

首先要記住的一句話就是Never use gets().
這是因為gets()函數不檢查目標數組是否能夠容納輸入,而若想把一個字符串讀到程序中,最先要做的事情就是預留存儲字符串的空間。所以這很容易導致分配的空間不夠大而數組越界,然而gets()函數並不檢查這個方面,所以導致的結果就是程序很容易出現漏洞,著名的“蠕蟲”病毒的原理就是用很長的數據覆蓋原有數據導致崩潰。所以對於重要的編程,永遠不要使用gets()!

1, gets()的參數是一個地址,因為要把從鍵盤輸入的值確定的放到某一塊內存中,所以需要指定它的地址,而通常使用gets(數組名)這種方式來把輸入的字符串傳入給定的數組中。注意:這個數組的大小一定要事先定義好!若不將數組的大小定義好,就有可能在輸入的時候不知道把字符串輸入到哪塊內存中去了,就有可能會導致對該內存中原代碼的覆蓋。

2,    gets()的第一個用法:直接用gets(array's name);這種方式時,由於不知道什么時候才會到字符串結尾,所以每當鍵入'\n', gets()函數都會自動讀取換行符前面的所有內容並且在末尾加上'\0',並且直接把這個字符串返回給調用它的程序,然后gets()再進行讀取並且會把讀取到的'\n'丟棄,這樣下一次讀取就會在新的一行開始。
例1:    

[cpp]  view plain  copy
 
  在CODE上查看代碼片 派生到我的代碼片
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #define MAX 81  
  4. int main(void)  
  5. {  
  6.     char name[MAX];  
  7.     printf("Hi, what's your name?\n");  
  8.     gets(name);  
  9.     printf("Nice name, %s\n", name);  
  10.     return 0;  
  11. }  
  12.   
  13. /* 
  14.     Hi, what's your name? 
  15.     Herry potter 
  16.     Nice name, Herry potter 
  17.  
  18. */  


3,  gets()的原型: char * gets(char * s)
                               {
                                          ...
                                       return s;
                               }
    所以由此可以看出gets()返回的是一個指向char類型數據的指針,而且這個指針與傳遞給他的是同一個指針。因此有如下程序:
例2:

[cpp]  view plain  copy
 
  在CODE上查看代碼片 派生到我的代碼片
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #define MAX 81  
  4. int main(void)  
  5. {  
  6.     char name[MAX];  
  7.     char * ptr;  
  8.   
  9.     printf("Hi,what's your name?\n");  
  10.     ptr = gets(name); // 這里的ptr是char類型的指針,此時ptr指向的是name的首地址。  
  11.     printf("%s? Ah? %s!", name, ptr); // 此時輸出name和ptr指向的值,可以發現,他們的輸出結果都一樣。  
  12.     return 0;  
  13. }  
  14.   
  15. /* 
  16.     Hi,what's your name? 
  17.     Herry 
  18.     Herry? Ah? Herry! 
  19. */  


4, 實際上gets()有兩種可能的返回值類型:

                                   1)當程序正常輸入字符串時:返回讀入字符串的地址,也就是字符串存放的數組的首地址;

                                      2)當程序出現錯誤或者遇到文件結尾時:返回空指針NULL,注意不要弄混空指針和空字符('\0');
                                          所以可以很方便的用如下形式檢測錯誤:
                                                                          while(gets(name) != NULL)

注意:現在基本上不使用gets(),可以說它是一個已經被廢棄的函數,現在可以用scanf(), getchar(), fgets()來代替它。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM