You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 05:55:25