首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

VS2015 scanf_s 循環輸入第二次崩潰問題根因與修復

     編輯:程式設計綜合問答

問題代碼

int main(void) {
    const int WEEK = 7;
    int days, weeks, left;
    
    printf("Please enter the numbers of days.\n");
    printf("Enter 0 to quit.\n");
    scanf_s("%d", &days);  // 第一次正常
    
    while (days != 0) {    // 此處原代碼誤用分號導致邏輯錯誤
        left = days % WEEK;
        weeks = days / WEEK;
        printf("%d days is %d weeks and %d days left.\n", days, weeks, left);
        scanf_s("%d", &days); // 第二次崩潰
    }
    return 0;
}

錯誤信息

異常: 0xC0000005: 寫入位置 0x00000014 時發生訪問沖突
位置: ucrtbased.dll

根因分析

  1. scanf_s 要求緩衝區大小: 對於 %c, %s, %[ 格式,必須提供緩衝區大小參數
  2. 整型雖不需要大小,但原代碼存在兩個關鍵錯誤:
    • while 後誤加分號導致循環體為空
    • 第二次 scanf_s 缺少 & 取地址符

修正代碼

int main(void) {
    const int WEEK = 7;
    int days = 0, weeks = 0, left = 0;
    
    printf("Please enter the numbers of days.\n");
    printf("Enter 0 to quit.\n");
    
    // 正確調用:有 & 取地址
    if (scanf_s("%d", &days) != 1) return 1;
    
    while (days != 0) {  // 無分號!
        left = days % WEEK;
        weeks = days / WEEK;
        printf("%d days is %d weeks and %d days left.\n", days, weeks, left);
        
        // 正確調用:有 & 取地址
        if (scanf_s("%d", &days) != 1) break;
    }
    return 0;
}

scanf_s 關鍵規則

格式符參數要求示例
%d, %i, %f變量地址scanf_s("%d", &num)
%c地址 + 大小(1)scanf_s("%c", &ch, 1)
%s地址 + 緩衝區大小scanf_s("%s", buf, sizeof(buf))

避坑指南

  • 始終檢查返回值(成功轉換的項數)
  • 循環條件後不加分號
  • 所有輸入參數必須加 &(字符串/數組除外)
  • 字符/字符串必須指定緩衝區大小
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved