【发布时间】:2018-05-27 18:28:56
【问题描述】:
我下面的程序在 C 中执行凯撒密码。出于某种原因,在用户输入消息后,printf(" \nEnter key:") 和
scanf("%d", &key) 语句被“跳过”。我的想法与输入缓冲区有关,输入缓冲区有一个字符和换行符,导致跳转(因此fflush 尝试)。如何防止这种行为?
#include <stdio.h>
#include <stdlib.h>
int main() {
char message[50], ms;
int i, key, choice;
printf("Enter 1. to Encrypt, or 2. to Decrypt: ");
scanf(" %d", &choice);
printf("Enter a message to process: ");
scanf(" %c", message);
printf(" \nEnter key:");
fflush(stdin);
scanf("%d", &key);
for (i = 0; message[i] != '\0'; ++i) {
ms = message[i];
if (ms >= 'a' && ms <= 'z' && choice == 1) {
ms = ms + key;
if (ms >= 'a' && ms <= 'z' && choice == 2) {
ms = ms - key;
if (ms > 'z') {
ms = ms - 'z' + 'a' - 1;
}
}
message[i] = ms;
} else
if (ms >= 'A' && ms <= 'Z' && choice == 1) {
ms = ms + key;
if (ms >= 'A' && ms <= 'Z' && choice == 2) {
ms = ms - key;
}
if (ms > 'Z') {
ms = ms - 'Z' + 'A' - 1;
}
message[i] = ms;
}
if (choice == 1) {
printf(" \nEncrypted message: %s", message);}
else if (choice == 2) {
printf(" \nDecrypted message: %s", message);}
}
}
【问题讨论】:
-
fflush(stdin)永远不会正确。fflush用于输出,而不是输入。 -
运行时,我得到这个输出:
Enter 1. to Encrypt, or 2. to Decrypt: 1 Enter a message to process: hello Enter key:1 Encrypted message: i。看来我没有跳过,但可能还有其他问题。 -
在评论2后面
scanf(" %c", message);是不正确的。message是一个数组,衰减为指针,而不是char。编译器警告过你吗?我没有,但直到你纠正输出是荒谬的。 -
scanf 不是一个很好的函数,因为它在执行转换失败时消耗输入的不可预测性。考虑使用 fgets 逐行读取输入,然后使用 sscanf,同时检查标准库函数的返回值。
-
gets既危险又过时。请使用fgets。不要混用这些方法。在其输入中使用fgets,然后使用sscanf。
标签: c encryption printf scanf fflush