Разница между чтением переменной с использованием scanf и присваивания - PullRequest
2 голосов
/ 22 августа 2010
int main()
{
  int i,j;
  i='c';

  scanf("%d",&j);   // I will read 'c' here 

  printf("%d %d",i,j);

}

Вывод не совпадает. 'j' принимает значение мусора, а 'i' принимает значение ascii 'c'. Кто-нибудь может сказать, в чем может быть причина?

Ответы [ 3 ]

6 голосов
/ 22 августа 2010

Ты scanf говорит:

scanf("%d", &j);

С этим предложением scanf попытается проанализировать (преобразовать) символ 'c', который вы используете в качестве ввода для функции, в число. Таким образом вы получите мусор . C не знает, как превратить 'c' в число, потому что scanf ожидает цифры.

Попробуйте изменить это на:

scanf("%c", &j);

Если ваш printf звонок такой:

printf("%d %d", i, j);

Вы должны получить одно и то же значение, оба раза: значение ASCII символа 'c'.

1 голос
/ 22 августа 2010

У вас есть две проблемы здесь.

Прежде всего, вы звоните scanf с %d. Это означает, что scanf будет искать десятичный символ и помещать его в j. Он не найдет ничего, поэтому оставит j без изменений.

Первое, что вам нужно сделать, это изменить %d на %c.

Теперь у вас есть другая проблема. j - это int, но вы читаете char в него. A char обычно меньше, чем int. Обычно char равен 8 битам, а int равен 32 или 64 битам. Теперь произойдет то, что scanf поместит значение ascii 'c' в младший байт j, но оставит остальное без изменений.

Вам нужно либо явно очистить j:

int j = 0;

или объявить его как символ:

char j;

Показывает разницу между назначением int или использованием scanf. Функция scanf не знает, что j является int. Он догадывается, какие указатели были ему отправлены, на основе строки формата. Когда вы используете формат %c, вы указываете scanf обрабатывать &j как указатель на символ, а если вы явно назначаете его с

j = 'c'

Компилятор знает, что 'c' - это char, а j - это int, и он сделает для вас правильное преобразование, включая обнуление старших битов.

0 голосов
/ 22 августа 2010

Вы действительно ничего не читаете в j. Я предполагаю, что j будет инициализирован нулем вашим компилятором и выведет 0. Так как мы в действительности не знаем, что в действительности выдает j, что мы действительно распечатали - мы можем только предположить, что это так. В другом примере, i, он, скорее всего, выведет значение ascii 'c', равное 99. Если вы хотите прочитать символ в j, то вам также нужно изменить% d на% c. Но я думаю, что вы действительно не намеревались использовать j, и его заменили бы на i, чтобы вы могли сравнить различия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...