cin和scanf输入到底有哪里不同?

我编写了一个将char类型的数字转化为int类型的。但是当我把scanf输入换为cin时,所有入栈的数都变为1个了,这是为什么呢?

#include<bits/stdc++.h>

using namespace std;

int main()
{
    int a;
    char ch;
    stack<int> st;
    while(1)
    {
        cin >> ch;
        if(ch == '@')
        {
            break;
        }
        if(ch >= '0' && ch <= '9')
        {
            a = ch - '0';
            while(cin >> ch)
            {
                if(ch >= '0' && ch <= '9')
                {
                    a *= 10;
                    a += ch - '0';
                }
                else
                {
                    break;
                }
            }
            st.push(a);
        }
        while(st.size())
        {
            cout << st.top() << endl;
            st.pop();
        }
    }

    return 0;
}

#include<bits/stdc++.h>

using namespace std;

int main()
{
    int a;
    char ch;
    stack<int> st;
    while(1)
    {
        cin >> ch;
        if(ch == '@')
        {
            break;
        }
        if(ch >= '0' && ch <= '9')
        {
            a = ch - '0';
            while(scanf("%c",&ch))
            {
                if(ch >= '0' && ch <= '9')
                {
                    a *= 10;
                    a += ch - '0';
                }
                else
                {
                    break;
                }
            }
            st.push(a);
        }
        while(st.size())
        {
            cout << st.top() << endl;
            st.pop();
        }
    }

    return 0;
}

但是scanf就不会出错。

会不会是输入的问题,你正常输入别换行,cin 它不会把回车符(\n)算进字符串中,所以才导致了并列输出