给一串字符叫做简单加密的代码中,为什么会出现这样的问题

想请教一下为什么下面这串代码有两个scanf,但是却能够运行而且结果是对的,但只有一个scanf的话运行结果是错的

#include<stdio.h>
int main() {
    int n;
    char c;
    scanf_s("%d", &n);
    printf("请输入您所要加密的字符串:");
    scanf_s("%d", &n);
    while ((c = getchar()) != '\n')
    { 
        c = c + n;
        printf("%c", c);
    }
    return 0;
}

img


这是能运行成功的情况
如果只有一个scanf的话,那就会像下面这样

img


输入一个数字,就结束运行了

代码得问题,主要是和scanf_s() 函数从键盘读入时,碰到 空格 换行符等字符时,停止读入而将字符残留在输入缓冲区里,从而造成后面的c=getchar()出现误判断,建议修改如下,见注释,供参考:

#include<stdio.h>
int main() {
    int n;
    char c;
    scanf_s("%d", &n);
    getchar(); //添加这行,吸收输入缓冲区里残留的 '\n'printf("请输入您所要加密的字符串:");
    //scanf_s("%d", &n); 这行删除
    while ((c = getchar()) != '\n')
    {
        c = c + n;
        printf("%c", c);
    }
    return 0;
}

你注视的是哪个

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7684732
  • 这篇博客你也可以参考下:在C语言中为什么scanf输入语句,要在变量名前加&呢?
  • 除此之外, 这篇博客: 【C语言】解决C语言题目中的多组输入问题中的 一、scanf在读取数字时 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 例题奉上

    int main() 
    {
        int n;
        while (scanf("%d", &n) != EOF)
        {
            if (n % 2 == 0)
            {
                printf("Even\n");
            }
            else
            {
                printf("Odd\n");
            }  
        }
        return 0;
    }
    

    我们这里先来给大家,介绍一下,如何利用循环实现多组输入的问题,我们可以利用scanf的返回值来作为判断条件,让他和EOF来进行比较,如果不等于EOF我们就继续进行scanf的数据的录入,当然我们在输入数字这一类型的数据时,回车这个东西在我们scanf从缓冲区中拿走数字之后,直接就被销毁了(我是这么理解的,当然你也可以把他理解为,scanf自动忽略了\n),这里如果想让程序结束的话,可以用crtl+z来控制程序的结束

  • 您还可以看一下 陈立臣老师的老陈的C语言从入门到入行课程中的 scanf混合输入的那些坑小节, 巩固相关知识点