在此先聲明,考慮到安全問題,以下程式碼無法在ZERO JUDGE上執行。
以下的程式碼有增強一些對記憶體操作相關指令的安全性,避免不可預期的溢位問題造成安全性問題
像是strcat的增強函示為strcat_s
scanf為scanf_s類似這樣…但兩者用法幾乎都沒有任何差異。
雖然無法在zero judge上執行,但實際上,是成功的程式碼。各位可以參考一下:)
#include<stdio.h>
#include<limits.h> //此函式庫是為了使用CHAR_MAX
#include<string.h>
int main() {
char str[CHAR_MAX]; //最後一個字元要留給'\0',作為字串的結尾。(使用者不用特別輸入'\0')
while (scanf_s("%s", &str, CHAR_MAX) != EOF) { //第三個引數代表scanf_s所能讀到的上限 , 至於EOF只是個數字,在<stdio.h>中,EOF是-1的意思。
strcat_s(str, sizeof(str), " ,world"); // strcat_s存在於<string.h>函式庫中,用來連接字串
// 承上,在strcat_s中,第一個引數是字串1號; 而第二個引數是從字串1號中「截取出來」的字串2號 (也就是我想拿來與別人連接的子字串); 至於第三個引數就是被連接的字串3號
printf("%s\n", str);
}
return 0;
}
以上是我的經驗分享,若有甚麼地方出現問題,歡迎指教
(本人也只是個新手,請不要鞭得太用力qq)
1.
以下的程式碼有增強一些對記憶體操作相關指令的安全性,避免不可預期的溢位問題造成安全性問題
像是strcat的增強函示為strcat_s
scanf為scanf_s類似這樣…但兩者用法幾乎都沒有任何差異。
雖然無法在zero judge上執行,但實際上,是成功的程式碼。各位可以參考一下:)
2.
#include<limits.h> //此函式庫是為了使用CHAR_MAX3.
while (scanf_s("%s", &str, CHAR_MAX) != EOF) { //第三個引數代表scanf_s所能讀到的上限 , 至於EOF只是個數字,在中,EOF是-1的意思。
4.
strcat_s(str, sizeof(str), " ,world"); // strcat_s存在於函式庫中,用來連接字串
1.
以下的程式碼有增強一些對記憶體操作相關指令的安全性,避免不可預期的溢位問題造成安全性問題
像是strcat的增強函示為strcat_s
scanf為scanf_s類似這樣…但兩者用法幾乎都沒有任何差異。
雖然無法在zero judge上執行,但實際上,是成功的程式碼。各位可以參考一下:)
2.
#include //此函式庫是為了使用CHAR_MAX3.
while (scanf_s("%s", &str, CHAR_MAX) != EOF) { //第三個引數代表scanf_s所能讀到的上限 , 至於EOF只是個數字,在中,EOF是-1的意思。
4.
strcat_s(str, sizeof(str), " ,world"); // strcat_s存在於函式庫中,用來連接字串
- strcat_s, scanf_s這種函式是屬於extension,好像只有Microsoft的編譯器有支援,大部分的編譯器都是不支援的,因為沒有必要
- 不懂為何要用CHAR_MAX,雖然說這樣用不是錯,可是我覺得直接定一個數字就好
- (1)str前面不用加&
(2)如果希望安全性,也可以用scanf指定寬度,例如scanf("%99s", str),或是改用fgets- (1)題目要求的輸出是在前面加"hello, "而不是在後面加" ,world"
(2)strcat不見得不安全,溢位是可預期的,只要大小算好就不會有問題了。或者也可以改用snprintf或是strncat。
抱歉...第一次寫評論,我的錯誤百出,謝謝你幫我指正。
真的很抱歉