#c #io
Вопрос:
Наш учитель попросил нас написать простую программу на C , чтобы добавить два числа в следующем формате:
input: 12 14
output: m n = 26
Программа также должна работать для других входных данных в форме:
input: Hello please add 12 and 14 !
output: m n = 26
Решение, которое было дано, было:
#include <iostream>
using namespace std;
int main(){
int m,n;
char ch;
while(cin.get(ch)){
if(isdigit(ch))
{
cin.putback(ch);
cin>>m;
break;
}
}
//cin.putback() restores the last character
//read by cin.get() back to the input stream
while(cin.get(ch)){
if(isdigit(ch))
{
cin.putback(ch);
cin>>n;
break;
}
}
cin.ignore(80,'n');
cout<<"m n = "<<m n<<endl;
return 0;}
Но теперь мне нужно знать, почему эта программа также работает для чисел, которые не являются однозначными цифрами. Разве cin.get(символ) не должен просто считывать одну цифру, а cin.putback() возвращать то же самое? Пожалуйста, помогите мне, я новичок.
Ответ №1:
Да, cin.get()
будет считываться только один символ за раз.
Важная часть, где на самом деле читается номер, — это 4 строки ниже: cin>>m;
. Это потребит как можно больше цифр и сохранит полученное целое число m
.
Еще несколько деталей:
// example with input 524 42
while(cin.get(ch)) // extract one character at a time
{ // ch='5', remaining input="24 42"
if(isdigit(ch)) // if it's a digit (0-9), then:
{
cin.putback(ch); // Put it back into the stream, "unread" it
// remaining input="524 42"
cin >> m; // extract an integer from stream
// m=524, remaining input="42"
break;
}
}
Причина циклов, по-видимому, заключается в том, чтобы пропустить любой нечисловой ввод до появления числа. Обратите внимание, что здесь есть небольшая ошибка, так как она также будет игнорировать ведущие знаки. (например, ввод -4 4
будет выводить m n = 8
)
Комментарии:
1. Спасибо! Я попытался прочитать те же данные с символом m вместо int m и обнаружил, что все цифры (до нецифрового символа) считываются в переменную int m, но в переменную char m считывается только первый символ. Я предполагаю, что это происходит из-за типа данных. Я попытаюсь исправить ошибку, о которой вы упомянули.