gets_s()函數的參數太少,strcpy_s():形參和實參 2 的類型不同,等c函數在Visual Studio上出現的問題, get()函數和scanf()讀取字符串的區別,棧的隨機性


首先,這些C函數,在VS上要加_s后綴的原因是,這些函數存在字符串越界等問題,可以參考這篇文章,https://blog.csdn.net/silleyj/article/details/8545408

 

個人猜測:由於這些C函數存在這些問題,所以VS編譯器直接屏蔽了這些函數,然后用了一套加上后綴_s的函數來實現相同的功能,為了解決之前函數的越界的問題,_s系列的函數又分別增加了一些形參,比如長度等,所以,即使我們在C語言函數的基礎上加上_s,還是會出現參數太少或形參類型和實參類型不匹配的問題。查看_s函數的形參列表的方式是:將光標移到你要查詢的函數名里,然后單擊右鍵,選擇查看定義(或者使用快捷鍵 Alt + F12),然后就可以看到新版本的安全的C函數的形參列表了,根據這個形參列表設置實參就可以了

比如:

  gets_s()函數的查詢結果:,可以看出,這個函數需要兩個參數,一個是字符串的首地址,另一個是字符串的最大長度

 strcpy_s()函數的查詢結果:,可以看出,這個函數需要傳遞三個參數,分別是目的字符串首地址, 目的地址的大小, 原字符串的首地址

  scanf_s的查詢結果是:這個查詢不出來,可以參考這篇文章:https://blog.csdn.net/silleyj/article/details/8545408, 輸入字符串還要傳遞一個大小,如:scanf_s("%s", s, 20);

  gets(s)函數可以讀取輸入的字符序列里的空格,作用相當於getline(cin, s);

  scanf("%s", s),只能空格前面的字符串,即認為遇到空格則停止讀取,作用相當於cin >> s;

 

棧的隨機性:

 1 //#include "SeqList.h"
 2 #include <stdio.h>
 3 #include <string.h>
 4 
 5 static int c = 2;
 6 int b = 0;
 7 int main()
 8 {
 9     
10     int a = 1;
11     const int d = 0;
12     printf("%p\n", &a);    //棧的隨機性,使得a所在的棧段的位置在不斷變化,所以a的地址每次執行這個文件a的地址都會變化
13     printf("%p\n", &c);
14     printf("%p\n", &b);
15     printf("%p\n", &d);
16     return 0;
17 }

 有關內存分區可以參考這篇文章:https://www.cnblogs.com/bakari/archive/2012/08/05/2623637.html


免責聲明!

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



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