2015-04-08 2 views
0

Я помогал однокласснику с его кодом и пробежал по нему. У меня были некоторые проблемы с scanf в прошлом, вероятно, из-за моего отсутствия опыта, но именно поэтому я здесь.Последовательные вызовы scanf

Итак, я заметил, что два последовательных вызова scanf или захват нескольких входных данных из одного вызова могут быть проблематичными. Рассмотрим следующее.

#include <stdio.h> 
#include <stdlib.h> 

void main(){ 

char input1, input2; 

//In 
fprintf(stdout,"\nInput1: "); 
fscanf(stdin,"%d",&input1); 
fprintf(stdout,"\nInput2: "); 
fscanf(stdin, "%d", &input2); 

//Out 
fprintf(stdout,"\nInput1: %d Input2: %d\n",input1,input2); 

} 

Почему зсапЕ будет печатать на экране нужные значения input1 & input2 еще, когда я печатаю назад те же две переменные с Printf, второе значение (input2), кажется перезаписаны Input1?

Это выход.

Input1: 1 

Input2: 0 

Input1: 0 Input2: 0 

Имеет ли это какое-либо отношение к буферу строки? Если да, может кто-нибудь объяснить это мне.

Благодарим вас.

ответ

0

Вы лежите как к scanf() и printf() о типах переменных input1 и input2. Дескриптор поля %d обещает, что соответствующий аргумент равен int (или указателю на один, для scanf()), но фактический тип в вашем коде: char. Поведение полученной программы не определено.

Ваша программа отлично работает для меня, если я изменю тип переменных на int.

+0

Спасибо человеку. Ты делаешь доброе дело. Я имею дело с двумя вещами, хотя 1 и 0 выполняет логические ворота. Мне нужно только одно байтовое хранилище. – Mozzy

+0

Предположим, что у вас есть куча из них, так что однобайтная или, возможно, четырехбайтная память делает реальную разницу, вы можете сканировать временный 'int', проверять результат, и если это нормально, то назначьте его к отдельной переменной 'char'. При выводе все, что вам нужно сделать, это нажать на 'int', если вы хотите использовать дескриптор поля'% d'. –

+0

Я вижу, хорошая идея. Это не совсем важно, но мне нравится знать все мои варианты. – Mozzy

0

Во-первых, вы должны (в целом, в частности, для интерактивных программ), а ставить \n в конце не начало printf из fprintf строки управления форматом. Или же использовать fflush

КСТАТИ %d для int ы объяви int input1, input2; и, если позволяет все предупреждения с GCC например компиляция с gcc -Wall -Wextra -g вы бы были предупреждены.

Затем вы должны всегда тест результат scanf (или fscanf); он дает количество прочитанных элементов.

См printf(3), fprintf(3), fflush(3), fscanf(3)

Если на Linux, смотрите также this answer о не дожидаясь полной линии.

+0

Почему бы не положить '\ n' в начале строки управления' printf() '? Это совершенно законно. –

+0

Из-за буферизации. –

+0

Хорошо, тогда, возможно, было бы разумно квалифицировать ваш совет, чтобы было ясно, что оно применяется специально для печати интерактивных подсказок. –

1

изменение char input1, input2; в int input1, input2;

+0

Это работает, но что, если я хочу рассматривать его как символ? Что ты предлагаешь? – Mozzy

+0

замените% d на% c – huxley

+0

Но имейте в виду, что если вы используете '% c' для сканирования символа цифры, такого как '0', значение * numeric * результирующего' char' отличается от значения, которое цифра * представляет *. То есть, '0 '! = 0'. –

0

Вы использовали% d, который читает целое число и сохраняет переменную типа char, что совершенно неверно.

Смежные вопросы