键盘和计算机之间有一个用于缓冲的内存,叫“键盘缓冲区”,你键入(按下了的键)的字符都是暂存在键盘缓冲区里,然后scanf()啊、gets()啊、getchar()啊这样的函数是去键盘缓冲区取需要的字符的,如果键盘缓冲区里已经有字符了,它们就会取已经在缓冲区里的字符,如果键盘缓冲区是空的,它们就会等待,这才有了“程序等你输入”的情况出现。比如你键入10个字符,但getchar()也只会取走一个,剩下9个都还留在键盘缓冲区里。
明白这一点后,接下来你看看你这个例子里键入了几个字符?你以为只有一个'5',其实你还按了一个ENTER!也就是一个'\n'!所以scanf("%d",&j)取走了键盘缓冲区里的那个'5',留下了那个'\n'。这样一来,当执行到scanf("%c",&abc)时,scanf()又跑去键盘缓冲区取字符,因为你指定了取字符的方式是%c,所以scanf()只去取一个字符,也就直接取到了'\n'而不等你从键盘输入。
要想解决这个问题,关键就是让scanf("%d",&j);之后,把留在缓冲区里的'\n'拿掉,所以我们可以用这个语句解决:
while(getchar()!='\n');
最后,请不要把int qq(int j);这样的函数声明放在main函数里面,这样的习惯不好
补充:所有从键盘敲进去的都是字符,例如你敲进去的5,只不过是你使用scanf()时指定了读取方式为%d,所以它才把这个字符'5'看做了数字5并存进变量里,理解这一点很重要。