【发布时间】:2019-03-25 15:12:16
【问题描述】:
我写这篇文章是为了尽可能多地理解我尝试计算的以下程序,因为我认为它在日常生活中有一些可能的应用。
程序是这样的(它是一个密码):
#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();
我认为这两者是完全等价的;事实上,我在网上搜索时发现了这个问题getchar:
此函数将读取的字符作为
unsigned char强制转换为文件结尾或错误时的int或EOF。
这就是我所期望的scanf() 所做的。
我发现:
如果我将所有字符都放在不带空格的位置,我会得到(我认为)双字母而不是两个字符的相同字符的移位。
while中的else无法按预期工作,因为一旦我输入了与字母字符不同的字符并看到结果,输出就会在该字符的无限字符串中失败。
【问题讨论】:
-
scanf()的新线管理很糟糕。只需停止使用scanf()进行用户输入并切换到fgets()(可能后跟sscanf())。 -
'\n'是一个字符。 -
getchar()的返回类型为int,您使用char类型变量来保存其返回值。 -
是的,它们更有用。
fgets()允许从错误的用户输入中恢复错误,并且可以自然地管理输入行(包括尾随的'\n')。 -
@jacopoburelli 了解getchar()。
getchar()返回类型是int,因为它在失败时返回EOF。