#30113: 解答 (C語言版)


10730094@ms2.hssh.tp.edu.tw (給開司一份薯片)

學校 : 不指定學校
編號 : 172670
來源 : [180.177.114.33]
最後登入時間 :
2023-01-01 23:20:42
a001. 哈囉 -- Brian Kernighan | From: [36.229.104.225] | 發表日期 : 2022-04-29 19:32

在此先聲明,考慮到安全問題,以下程式碼無法在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)

 

 
#30120: Re: 解答 (C語言版)


cges30901 (cges30901)

學校 : 不指定學校
編號 : 30877
來源 : [39.9.74.255]
最後登入時間 :
2024-10-14 22:20:08
a001. 哈囉 -- Brian Kernighan | From: [39.10.162.231] | 發表日期 : 2022-04-30 10:04

 

1.

以下的程式碼有增強一些對記憶體操作相關指令的安全性,避免不可預期的溢位問題造成安全性問題

像是strcat的增強函示為strcat_s

scanf為scanf_s類似這樣…但兩者用法幾乎都沒有任何差異。

雖然無法在zero judge上執行,但實際上,是成功的程式碼。各位可以參考一下:)

 


2.
#include<limits.h> //此函式庫是為了使用CHAR_MAX

3.

    while (scanf_s("%s", &str, CHAR_MAX) != EOF) {   //第三個引數代表scanf_s所能讀到的上限 , 至於EOF只是個數字,在中,EOF是-1的意思。

4.

        strcat_s(str, sizeof(str), " ,world"); // strcat_s存在於函式庫中,用來連接字串

 

 

  1. strcat_s, scanf_s這種函式是屬於extension,好像只有Microsoft的編譯器有支援,大部分的編譯器都是不支援的,因為沒有必要
  2. 不懂為何要用CHAR_MAX,雖然說這樣用不是錯,可是我覺得直接定一個數字就好
  3. (1)str前面不用加&
    (2)如果希望安全性,也可以用scanf指定寬度,例如scanf("%99s", str),或是改用fgets
  4. (1)題目要求的輸出是在前面加"hello, "而不是在後面加" ,world"
    (2)strcat不見得不安全,溢位是可預期的,只要大小算好就不會有問題了。或者也可以改用snprintf或是strncat。
 
#30124: Re: 解答 (C語言版)


10730094@ms2.hssh.tp.edu.tw (給開司一份薯片)

學校 : 不指定學校
編號 : 172670
來源 : [180.177.114.33]
最後登入時間 :
2023-01-01 23:20:42
a001. 哈囉 -- Brian Kernighan | From: [36.229.106.10] | 發表日期 : 2022-04-30 13:11

 

1.

以下的程式碼有增強一些對記憶體操作相關指令的安全性,避免不可預期的溢位問題造成安全性問題

像是strcat的增強函示為strcat_s

scanf為scanf_s類似這樣…但兩者用法幾乎都沒有任何差異。

雖然無法在zero judge上執行,但實際上,是成功的程式碼。各位可以參考一下:)

 


2.
#include //此函式庫是為了使用CHAR_MAX

3.

    while (scanf_s("%s", &str, CHAR_MAX) != EOF) {   //第三個引數代表scanf_s所能讀到的上限 , 至於EOF只是個數字,在中,EOF是-1的意思。

4.

        strcat_s(str, sizeof(str), " ,world"); // strcat_s存在於函式庫中,用來連接字串

 

 

  1. strcat_s, scanf_s這種函式是屬於extension,好像只有Microsoft的編譯器有支援,大部分的編譯器都是不支援的,因為沒有必要
  2. 不懂為何要用CHAR_MAX,雖然說這樣用不是錯,可是我覺得直接定一個數字就好
  3. (1)str前面不用加&
    (2)如果希望安全性,也可以用scanf指定寬度,例如scanf("%99s", str),或是改用fgets
  4. (1)題目要求的輸出是在前面加"hello, "而不是在後面加" ,world"
    (2)strcat不見得不安全,溢位是可預期的,只要大小算好就不會有問題了。或者也可以改用snprintf或是strncat。

抱歉...第一次寫評論,我的錯誤百出,謝謝你幫我指正。

真的很抱歉

 
ZeroJudge Forum