Visual Studio版本兼容问题:2016年书籍C代码运行异常求助
问题排查:Visual Studio版本差异导致的代码运行异常
你标注的两处问题以及代码中其他语法错误,主要和Visual Studio对C语言安全标准的更新有关,以下是具体分析和修正方案:
1. 标注问题的具体修复
第一处:printf行的无效反斜杠
你在printf语句末尾添加的\属于语法错误,直接删除即可,修正后代码:
printf("%s", "Enter a string (no longer than 19 characters): ");
第二处:scanf_s的参数缺失
新版Visual Studio中的scanf_s是符合C安全标准的增强输入函数,和传统scanf不同,它要求额外传递缓冲区大小参数(避免缓冲区溢出)。原代码仅传入格式串和数组名,缺少该参数导致运行报错,修正写法:
scanf_s("%19s", string1, SIZE);
或使用VS内置宏_countof自动获取数组长度:
scanf_s("%19s", string1, (unsigned)_countof(string1));
2. 代码中的其他语法错误
除了你标注的问题,还有两处明显错误需要修复:
- 第一个输出
string1的printf语句末尾缺少分号; - 第二个
printf的格式串与参数不匹配:格式串只有一个%s占位符,却传入了三个参数,需调整为对应格式,示例:
printf("string2 is: %s\nstring1 with spaces between characters is:\n", string2);
修正后的完整代码
#include <stdio.h> #include <string.h> #define SIZE 20 int main(void) { char string1[SIZE]; char string2[] = "string literal"; size_t i; printf("%s", "Enter a string (no longer than 19 characters): "); scanf_s("%19s", string1, SIZE); printf("string1 is: %s\n", string1); printf("string2 is: %s\nstring1 with spaces between characters is:\n", string2); for (i = 0; i < SIZE && string1[i] != '\0'; ++i) { printf("%c ", string1[i]); } puts(""); return 0; // 补充main函数返回值,符合C标准规范 }
版本差异说明
2016年的教材多基于旧版C标准或早期Visual Studio版本,当时scanf_s的安全参数要求未被严格执行,部分教材甚至简化了该函数的使用。而新版Visual Studio(2019及以后)严格遵循C11/C17安全标准,强制要求scanf_s传递缓冲区大小参数,这是导致你代码运行异常的核心原因。
内容的提问来源于stack exchange,提问作者Ksenia
相关产品推荐
相关产品推荐

