我写本文章的目的是尽可能地理解以下尝试计算的程序,因为我认为该程序在日常生活中可能会有一些应用。

该程序是这样的(它是一个密码):

#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;
}

如您所见,我正在尝试移动输入中给定的某个常数的字母。

我不太了解并且我不太了解的事情就是为什么该程序在没有scanfgetchar的情况下不应运行,并且两者都必须具有相同的值,让我们在这里说:
scanf("%c", &d);
d = getchar();

我以为两者是完全相同的。实际上,在Internet上搜索时,就getchar而言,我发现了这一点:



这就是我所期望的scanf()所做的。

我发现:
  • 如果我将所有字符都放在不带空格的位置(我想),我只是将相同字符的移位换成双字母而不是两个。
  • else中的while不能按预期工作,因为一旦我将一个与字母字符不同的字符放入,并看到结果,该输出将在该字符的无限字符串中失败。
  • 最佳答案

    是的,有一些区别。

    主要的是在读取字符失败的情况下的行为。 (通常这可能是由于输入流被关闭而发生的,但是还有其他导致读取失败的原因)。
    scanf函数通过其返回值指示失败。如果不检查返回值(因为您不在代码中),那么您将无法知道读取是否失败。在这种失败情况下,d可能会保留其旧值,尽管我不确定该标准是否可以保证。
    getchar()通过返回EOF来指示失败,该值是一个负整数值(通常是-1,但不能保证是)。在您的代码中,您可以编写d=getchar(),这意味着您无法从有效读取的字符与EOF相同的字符中区分出此结果。 (常见系统的字符在-128127范围内)。 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/

    10-11 22:10
    查看更多