在C中扫描和打印字符时发生了奇怪的代码交互



当您声明两个变量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);
}

这是一种令人困惑的情况。当涉及到混合charint值时(正如您在研究字符集中字符的数值时可能会做的那样(,结果发现scanfprintf的规则几乎完全不同。

首先让我们看一下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变量ab中。(事实上,如果在键入ab的字符之间按Return键,您会遇到其他问题,但情况不同。(

当涉及到打印字符时,你有更多的自由。您的线路

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

都很好。如果您想查看与字符相关联的整数字符集值,您可以键入

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

这也会奏效的。这是因为当您调用printf(以及其他类似的函数(时,会发生一些自动转换:类型charshort int会自动升级为(传递为(int,类型float会升级为double。但这些自动转换仅发生在这些类型的上(如调用printf时(。当您将指针传递给这些类型时,没有=这样的转换,就像调用scanf时一样。

如果你想读数字而不是字符呢?也就是说,如果你想输入数字65,并看到它被打印为大写A,该怎么办?有几种可能的方法可以做到这一点。

第一种方法是在scanf调用中继续使用%d,但将变量的类型更改为int:

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

现在,您可以使用%c%d打印ab,它会很好地工作。

在重新分配给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打印ab,它会很好地工作。

程序的目的是读取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);
}

相关内容

最新更新