当您声明两个变量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);
}
这是一种令人困惑的情况。当涉及到混合char
和int
值时(正如您在研究字符集中字符的数值时可能会做的那样(,结果发现scanf
和printf
的规则几乎完全不同。
首先让我们看一下scanf
行:
char a,b;
scanf("%d",&a);
scanf("%d",&b);
总之,这是错误的。scanf
中的%d
格式仅用于扫描int
值。不能使用%d
输入char
类型的值。如果你想输入一个字符,它的格式是%c
(尽管它会以字符而不是数字的形式输入(。
所以你需要把它改成
char a,b;
scanf("%c",&a);
scanf("%c",&b);
现在,您可以键入像A
、$
和3
这样的字符,并将它们读取到char
变量a
和b
中。(事实上,如果在键入a
和b
的字符之间按Return键,您会遇到其他问题,但情况不同。(
当涉及到打印字符时,你有更多的自由。您的线路
printf("%c",a);
printf("%c",b);
都很好。如果您想查看与字符相关联的整数字符集值,您可以键入
printf("%d",a);
printf("%d",b);
这也会奏效的。这是因为当您调用printf
(以及其他类似的函数(时,会发生一些自动转换:类型char
和short int
会自动升级为(传递为(int
,类型float
会升级为double
。但这些自动转换仅发生在这些类型的值上(如调用printf
时(。当您将指针传递给这些类型时,没有=这样的转换,就像调用scanf
时一样。
如果你想读数字而不是字符呢?也就是说,如果你想输入数字65,并看到它被打印为大写A
,该怎么办?有几种可能的方法可以做到这一点。
第一种方法是在scanf
调用中继续使用%d
,但将变量的类型更改为int
:
int a,b;
scanf("%d",&a);
scanf("%d",&b);
现在,您可以使用%c
或%d
打印a
和b
,它会很好地工作。
在重新分配给char
之前,您也可以使用一个临时int
变量,如下所示:
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
。"同样,您可以使用%c
或%d
打印a
和b
,它会很好地工作。
程序的目的是读取121和120并打印yx
执行
#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);
}