Странное взаимодействие кода при сканировании и печати символов в C - PullRequest
0 голосов
/ 01 ноября 2019

Когда вы объявляете две переменные char a, b;и затем вы используете сначала «a», а затем «b», он печатает только «b», но если вы объявите «b», а затем «a», у него не возникнет проблем при печати в ASCII, смысл программы - прочитать 121и 120 и напечатать yx. проблема - https://prnt.sc/pr5nww
, а если поменять их местами - https://prnt.sc/pr5mt5

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

int main(){

    char a,b;

    scanf("%d",&a);
    scanf("%d",&b);

    printf("%c",a);
    printf("%c",b);
}

Ответы [ 2 ]

2 голосов
/ 01 ноября 2019

Это довольно запутанная ситуация. Когда дело доходит до смешивания значений char и int (как вы могли бы это делать при исследовании числовых значений символов в наборе символов), оказывается, что правила для scanf и printf почти полностью различаются.

Сначала давайте посмотрим на строки scanf:

char a,b;
scanf("%d",&a);
scanf("%d",&b);

Одним словом, это неправильно. Формат %d в scanf предназначен для сканирования int значений * только 1014 * . Вы не можете использовать %d для ввода значения типа char. Если вы хотите ввести символ, формат для него будет %c (хотя он будет вводиться как символ, а не число).

Так что вам нужно изменить его на

char a,b;
scanf("%c",&a);
scanf("%c",&b);

Теперь вы можете вводить такие символы, как A и $ и 3 и читать их в ваши char переменные a и b. (На самом деле, у вас возникнут дополнительные проблемы, если вы нажмете клавишу Return между вводом символов для a и b, но это другая история.)

Когда дело доходит до печати символову вас есть немного больше свободы. Ваши строки

printf("%c",a);
printf("%c",b);

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

printf("%d",a);
printf("%d",b);

, и это тоже сработало бы. Это происходит потому, что когда вы вызываете printf (и другие функции, такие как он), происходят некоторые автоматические преобразования: типы char и short int автоматически повышаются до (передаются как) int, а тип float повышен до double. Но эти автоматические преобразования происходят только для значений этих типов (как при вызове printf). A = нет такого преобразования, когда вы передаете указатели на этих типов, как при вызове scanf.

Что если вы хотите читать цифры, а не символы? То есть, что если вы хотите ввести число 65 и увидеть, что оно напечатано как прописная A? Есть несколько возможных способов сделать это.

Первый способ - продолжать использовать %d в вашем вызове scanf, но изменить тип ваших переменных на int:

int a,b;
scanf("%d",&a);
scanf("%d",&b);

Теперь вы можете печатать a и b, используя %c или %d, и все будет работать нормально.

Вы также можете использовать временную переменную intперед переназначением на char, например так:

char a,b;
int tmp
scanf("%d",&tmp);
a = tmp;
scanf("%d",&tmp);
b = tmp;

Последний, менее известный и несколько более неясный способ - использовать модификатор h. Если вы скажете

char a,b;
scanf("%hhd",&a);
scanf("%hhd",&b);

, то теперь вы говорите scanf: «Я хочу прочитать десятичные цифры, но целевой переменной является char, а не int». И, опять же, вы можете распечатать a и b, используя %c или %d, и все будет работать нормально.

1 голос
/ 01 ноября 2019

смысл программы - прочитать 121 и 120 и напечатать yx

Do

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

int main(void)
{
  char a, b;

  /* Scan into the half of the half of an int (the leading blank 
     makes scanf() eat whitespaces): */
  scanf(" %hhd", &a); 
  scanf(" %hhd", &b);

  /* Print the half of the half of an int: */
  printf("%hhd", a);
  printf("%hhd", b);
}

Для печати символовбуквально сделайте печатную часть так:

  ...

  printf("%c", a);
  printf("%c", b);
}
...