我最近在練程式時,發現一個小問題
同一個程式(C++/C),在兩個編譯器都有不同結果
Dev C++ 版本:5.11
Visual Studio 版本:2017 15.8
程式碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct BOX {
int size = 10;
char cname[6] = "Tom" ;
}TTbox;
int main() {
printf("%d\n", TTbox.size);
printf("%s\n", TTbox.cname);
strcpy(TTbox.cname, "Peter");
printf("%s\n", TTbox.cname);
system("pause");
}
以上程式,Dev C++可以輸出結果;但Visual Studio不行
Visual Studio表示:strcpy有異常,不能使用
但,如果不用strcpy,要更改字串就需要TTbox.cname[0],TTbox.cname[1]....
另一個程式
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct BOX {
int size = 10;
char cname[5] = "Tom";
};
int main() {
struct BOX TTbox = { 50,"Sam" };
printf("%d\n", TTbox.size);
printf("%s\n", TTbox.cname);
system("pause");
}
以上程式,Dev C++不行;而Visual Studio可以輸出結果
Dev C++表示:struct BOX TTbox = { 50,"Sam" }中的{ }有問題
所以Dev C++不能新增struct的同時,把所有參數加入進去?
想問為什麼會有這樣問題,要如何解決?
不同編譯器的解讀方式不一樣,
甚至某些未定義的行為會產生不同的結果,
解決方式就是自己寫一個自己喜歡的編譯器 (逃
有些編譯器會加一些比較方便的功能,
但是其他的編譯器不一定會有,
找一種自己的喜歡來用習慣就好了,
這沒有對與錯,
用習慣就好了。
這裡還有很多編譯器,
有時間的話你可以整理一個表格列出每個編譯器不一樣的地方
深受C/C++程式設計師歡迎的11款IDE
第一個問題, strcpy
不是不能用, 而是他有安全問題所以預設會擋掉, 解決的方式也寫在錯誤訊息裡面了, 看是要改用 strncpy
還是想辦法關掉這個檢查都可以。
想想看:
strcpy(TTbox.cname, "Christina");
是不是超過了你的 char cname[6]
能放的數量? 這就是一個可以攻擊的點, 造成的安全漏洞是很嚴重的。strncpy
因為能夠指定複製的長度上限所以可以避開這個問題。
第二個問題, 錯誤訊息也都告訴你了, Dev C++ 用的是 C++98 的標準去編譯的, 所以你應該去加個編譯參數使用 C++11 或 C++0x 就行了, 不同的標準對語法的支援有差異是很正常的。