問題代碼
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
根因分析
- scanf_s 要求緩衝區大小: 對於
%c, %s, %[ 格式,必須提供緩衝區大小參數
- 整型雖不需要大小,但原代碼存在兩個關鍵錯誤:
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)) |
避坑指南
- 始終檢查返回值(成功轉換的項數)
- 循環條件後不加分號
- 所有輸入參數必須加
&(字符串/數組除外)
- 字符/字符串必須指定緩衝區大小