一段代码放在循环里为什么不对

原题:小写字符的判断
描述
输入一个字符,如果是小写就转成大写输出,如果是其他都直接输出
输入
第1行是一个整数n,表示随后有n组数据。每组数据占一行。
输出
对每组数据,如果是小写就转成大写输出,如果是其他都直接输出,并换行
样例
输入 输出
2
a A
B B

这是我的代码:

#include <stdio.h>
#include <ctype.h>
int main ()
{
    int n,i=0;
    char ch;
    scanf ("%d",&n);
    for (i=0;i<n;i++)
    {
        scanf("%c",&ch);
        printf("%c\n",toupper(ch));
    }
    return 0; 
}

以及下面这种:

#include <stdio.h>
#include <ctype.h>
int main ()
{
    int n,i=0;
    scanf("%d",&n);
    char ch;
    for(i=0;i<n;i++)
    {
        ch=getchar();
        putchar(toupper(ch));
    }
    return 0; 
}

都无法正常输出:

img

调试的时候输入n之后就卡住了,没法继续了,这种情况应该怎么办?

scanf ("%d",&n);后需要接收一下回车符
scanf("%c",&ch);后也需要接收一下回车符
代码修改如下

#include <stdio.h>
#include <ctype.h>
int main ()
{
    int n,i=0;
    char ch;
    scanf ("%d",&n);
    getchar(); //这里添加一句
    for (i=0;i<n;i++)
    {
        scanf("%c",&ch);
        getchar();//这里添加一句
        printf("%c\n",toupper(ch));
    }
    return 0; 
}

你是输入一个字符就按回车键了吧?
在scanf("%c",&ch);后加一行getchar();