You need to enable JavaScript to run this app. C程序完成用户姓名输入读取后运行冻结,多番排查未果求助
优惠活动
大模型
产品
解决方案
定价
更多

C程序完成用户姓名输入读取后运行冻结,多番排查未果求助

运行冻结问题根因

核心故障点在scanf(" %s %s ", firstname, lastname);这行代码的格式字符串末尾,多带了一个无效空格。
C语言标准库对scanf格式串的空白字符匹配规则做了明确规定:格式串中出现的任意空白字符(包括空格、换行、制表符),会自动跳过输入流中所有连续的空白内容,函数会一直阻塞,直到捕获到下一个非空白的输入字符,才会结束当前格式匹配、返回函数值。
对应到代码逻辑里:

  • 格式串开头的空格会跳过输入流开头可能残留的换行,这个设计是合理的
  • 两个%s会分别匹配输入中两段不带空格的姓名内容
  • 格式串末尾额外的空格,会触发上述空白匹配规则:读完两个姓名字符串后,程序会持续在输入流中跳过所有换行、空格这类空白内容,一直阻塞等待用户输入一个非空白的有效字符,才会继续执行后续代码。用户输完两个姓名按回车后,当前输入全是空白,没有后续非空白输入,程序就会一直卡在scanf的等待逻辑中,表现为无响应冻结。
    这是很多C语言开发者容易踩的隐藏坑:大家通常只注意到空格用来分隔两个%s输入,完全没意识到格式串末尾的空格会触发额外的阻塞等待逻辑,在控制台交互场景下,用户输完预期内容按回车后,程序不会向下执行,看起来就像程序卡死了。
修复方案
  • 直接删除scanf格式串末尾多余的空格,将格式串修改为" %s %s",即可消除额外的阻塞等待逻辑,程序读完两个姓名后就会正常向下执行打印问候语。
  • 建议额外加上输入长度限制,避免用户输入过长导致字符数组越界溢出:将代码改写为scanf("%39s %39s", firstname, lastname);,这里的39对应40字节数组的可用长度,预留1个位置存储字符串结束符\0,运行更稳定安全。

内容的提问来源于stack exchange,提问作者Sukhdev Banwait

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.02 01:36:03