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

scanf("%[^ ]s")用法疑问:输入一次重复输出10次及与gets()的区别

问题原因

你的代码出现重复输出的核心问题有两个:

  1. scanf格式串错误:%[^\n]是一个完整的转换说明符,用于读取所有非换行符的字符,你额外加的s是无效内容。scanf执行时,先读取完所有非换行字符后,会尝试匹配格式串里的s,但输入中没有这个字符,导致匹配失败直接返回,输入末尾的换行符会留在输入缓冲区。
  2. 换行符残留导致循环失效:即使把格式串改成正确的%[^\n],scanf也不会读取并丢弃换行符。后续循环的scanf调用会直接遇到缓冲区里的换行符,而%[^\n]会因第一个字符就是被排除的换行符,读取失败,此时c数组的内容不会被更新,还是第一次输入的内容,因此会连续输出10次首次输入的内容。

scanf("%[^\n]")与gets()的区别

  1. 换行符处理:
    • scanf("%[^\n]"):不会读取输入末尾的换行符,这个换行符会留在输入缓冲区中,影响后续输入操作;如果输入开头就是换行符,会直接读取失败,不修改目标数组。
    • gets():读取整行内容直到换行符,并且会自动丢弃末尾的换行符(不存入目标数组),不会留在缓冲区。
  2. 读取逻辑:
    • scanf("%[^\n]")是格式化输入,受格式串中其他字符影响(比如你代码里多余的s会导致匹配失败),只读取符合规则的非换行字符。
    • gets()是单纯的行读取,不处理任何格式,只要是输入流中的字符(直到换行或EOF)都会读取。
  3. 安全性:
    • 两者都存在缓冲区溢出风险,因为都不会检查目标数组的长度,输入过长会覆盖内存。但gets()已在C11标准中被移除,官方推荐使用fgets()替代。

内容的提问来源于stack exchange,提问作者오서진

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 06:10:24