2023年5月21日 星期日

C 語言 scanf() 沒有接收傳回值出現 warning 問題

今天在 replit.com 上測試 C 語言發現一個問題, 當程式中用 scanf() 讀取鍵盤輸入時, 編譯過程會出現 "ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’" 警告訊息, 例如 : 

#include <stdio.h>

int main() {
    int age;
    printf("請輸入年齡 =>");
scanf("%d", &age); 
    printf("您的年齡:%d\n", age);  
    return 0;
    }

執行結果如下 :

test.c: In function ‘main’:
test.c:6:9: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
    6 |         scanf("%d", &age);
      |         ^~~~~~~~~~~~~~~~~
請輸入年齡 =>20
您的年齡:20

原因是 scanf() 是有回傳值的, 它會傳回成功讀取與賦值之攔位數, 例如成功讀取一個變數就傳回 1, 否則傳回 0, 參考 :


若要避開此 warning 可宣告一個 int 變數來接收其傳回值, 例如 : 

#include <stdio.h>

int main() {
    int age;
    printf("請輸入年齡");
int x=scanf("%d", &age); 
printf("%d\n", x);
    printf("您的年齡:%d", age);  
    return 0;
    }

當輸入整數則讀取會成功且傳回 1; 若輸入字串例如 abc 會讀取失敗傳回 0. 

另一個作法是把 scanf() 放在一個空的 if 裡也可以, 例如 :

#include <stdio.h>

int main() {
    int age;
    printf("請輸入年齡");
if (scanf("%d", &age)) {}   # 空的 if
    printf("您的年齡:%d", age);  
    return 0;
    }

但空的 if 感覺有點怪. 

沒有留言 :