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

C语言程序输入首字符为D时异常打印双引号问题求助

问题根因

你遇到的异常输出本质是输入缓冲区残留的换行符被逻辑处理后刚好对应双引号的ASCII码,具体逻辑如下:

  1. 你每次输入完内容按下的回车键,会生成ASCII为10的换行符\n留在输入缓冲区
  2. scanf("%d", &disp)和scanf("%d", &size)只会读取数字内容,读完后不会处理后续残留的换行符
  3. 进入case 'D'的循环后,第一次调用getchar()不会读你后续输入的字符串,而是先读到缓冲区残留的换行符\n
  4. 按你的解密逻辑计算:换行符ASCII值10减偏移量2等于8,8小于小写字母a的ASCII值97,触发补26的逻辑,最终得到8+26=34,34恰好是双引号"的ASCII值,因此会先打印一个双引号。
  5. 你以为输入首字符为C时逻辑正常,其实只是因为加密逻辑下,换行符10加偏移量2等于12,对应的是不可见的控制字符,肉眼无法识别而已,本质也存在多读一个字符的问题。

修复方案

你只需要修改两处代码即可解决问题:

  1. 在读取完size之后清空输入缓冲区的残留换行,避免后续getchar()读到无效字符
  2. 把循环条件从i<=size改成i<size,原逻辑多跑了一次循环,刚好是用来读残留换行的,清理缓冲区后不需要多跑这一次

修复后的完整代码

#include <stdio.h>
int main() {
  char cd, m;
  int size, i, disp, m1;
 
  cd=getchar();
  scanf("%d", &disp);
  scanf("%d", &size);
  // 新增:清空输入缓冲区残留的换行符
  while(getchar() != '\n');
 
  switch(cd)
  {
  case 'C':
  // 循环条件改为i < size
  for(i=0; i<size; i++)
  {
    m=getchar();
    m1=m+disp;
    if(m1>122)
    {
      m1=m1-26;
    }
    printf("%c", m1);
  }
  break;

  case 'D':
    // 循环条件改为i < size
    for(i=0; i<size; i++)
    {
      m=getchar();
      m1=m-disp;
      if(m1<97)
      {
        m1=m1+26;
      }
      printf("%c", m1);
    } 
    break;
  }
  printf("\n");
  return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 02:15:03