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

C语言scanf输入疑问:循环未执行完提前终止原因解析

问题原因分析

这段代码的核心问题是缓冲区溢出导致的内存越界修改,具体拆解如下:

  • scanf("%s")的行为特性
    scanf("%s")会读取输入中直到空白字符(空格、换行、制表符)的所有字符,并且会自动在读取到的字符串末尾添加一个'\0'(字符串结束符)来标记字符串结束。

  • 数组空间不足引发溢出
    代码里定义的char s[1]仅分配了1个字节的内存空间。当输入单个字符时,scanf需要存储该字符加上'\0',总共需要2个字节的空间——这直接超出了s的容量,触发缓冲区溢出。

  • 溢出破坏循环变量t
    程序的局部变量t和s通常会被分配在相邻的栈空间中。溢出的'\0'会写入s数组之外的内存区域,刚好覆盖了t的存储位置,将t的值修改为0。这直接导致while(t--)的循环条件不再满足,程序提前终止。

注:这种缓冲区溢出属于C语言中的未定义行为,若输入多个非空白字符,会造成更严重的内存破坏,可能引发程序崩溃或其他不可预测的结果。


内容的提问来源于stack exchange,提问作者Nguyễn Tùng Duong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 00:25:28