我写本文章的目的是尽可能地理解以下尝试计算的程序,因为我认为该程序在日常生活中可能会有一些应用。
该程序是这样的(它是一个密码):
#include <stdio.h>
void cifrario(int k) {
char b, d;
scanf("%c", &d);
d = getchar();
putchar(d);
scanf("%c", &b);
b = getchar();
while (b != d) {
if (('A' <= b && b <= 'Z') || ('a' <= b && b <= 'z')) {
b = b + k;
printf("%c", b);
scanf("%c", &b);
b = getchar();
} else
printf("%c", b);
}
}
int main() {
int h;
scanf("%d", &h);
cifrario(h);
return 0;
}
如您所见,我正在尝试移动输入中给定的某个常数的字母。
我不太了解并且我不太了解的事情就是为什么该程序在没有
scanf
或getchar
的情况下不应运行,并且两者都必须具有相同的值,让我们在这里说:scanf("%c", &d);
d = getchar();
我以为两者是完全相同的。实际上,在Internet上搜索时,就
getchar
而言,我发现了这一点:这就是我所期望的
scanf()
所做的。我发现:
else
中的while
不能按预期工作,因为一旦我将一个与字母字符不同的字符放入,并看到结果,该输出将在该字符的无限字符串中失败。 最佳答案
是的,有一些区别。
主要的是在读取字符失败的情况下的行为。 (通常这可能是由于输入流被关闭而发生的,但是还有其他导致读取失败的原因)。scanf
函数通过其返回值指示失败。如果不检查返回值(因为您不在代码中),那么您将无法知道读取是否失败。在这种失败情况下,d
可能会保留其旧值,尽管我不确定该标准是否可以保证。getchar()
通过返回EOF
来指示失败,该值是一个负整数值(通常是-1
,但不能保证是)。在您的代码中,您可以编写d=getchar()
,这意味着您无法从有效读取的字符与EOF
相同的字符中区分出此结果。 (常见系统的字符在-128
到127
范围内)。 d
将永远不会保留此代码的先前值。
为了正确处理错误,您可以使用scanf
并测试返回值是1
;或将getchar()
的结果存储在int
中,并在继续将其分配给EOF
之前检查该值是否不是char
。
成功案例也有理论上的区别。这与现代系统无关。 scanf
版本将成功字符存储在d
中。但是,getchar()
版本返回一个非负整数,该整数是转换为unsigned char
的字符。然后,代码d=getchar()
涉及将此值转换为char
。如果对char
进行了签名,这将调用实现定义的行为,并且可能导致与scanf
获得的字符代码不同的字符代码。我不知道有什么系统可以做到这一点。
两种版本都从流中读取下一个可用字符。在问题的底部,您描述了其他行为,但是我认为您将scanf
和"%d"
的行为与"%c"
的行为混淆了。
在您的程序中,如果您从未遇到过与while (b != d)
相同的其他字符,则d
将永远不会终止,您需要解决此问题并确保其在读取失败时终止。
关于c - scanf ("%c",&x)和x = getchar()之间有区别吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52914182/