C 程序跳过 printf 和 scanf 语句
C program skipping printf and scanf statements
我下面的程序在 C 中执行凯撒密码。出于某种原因,在用户输入消息后,printf(" \nEnter key:")
和
scanf("%d", &key)
语句得到 "jumped" 结束。我的想法与输入缓冲区有关,输入的字符和换行符导致跳转(因此 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] != '[=10=]'; ++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);}
}
}
您的代码中存在多个问题:
您输入消息的方式不正确:scanf(" %c", message);
将单个字节读入 message
第一个元素,甚至没有使其成为 C 字符串。改用它来阅读带有嵌入空格的消息:
scanf("%49[^\n]", message);
其余代码中存在逻辑错误:例如,您在仅在 choice == 1
...[= 时执行的块内测试 choice == 2
16=]
这是一个简化版本:
#include <stdio.h>
int main() {
char message[50];
int i, key, choice;
printf("Enter 1. to Encrypt, or 2. to Decrypt: ");
if (scanf("%d", &choice) != 1)
return 1;
printf("\nEnter a message to process: ");
if (scanf("%49[^\n]", message) != 1)
return 1;
printf("\nEnter key:");
if (scanf("%d", &key) != 1)
return 1;
for (i = 0; message[i] != '[=11=]'; ++i) {
int ms = message[i];
if (ms >= 'a' && ms <= 'z') {
if (choice == 1)
ms = 'a' + ((ms - 'a') + key) % 26;
if (choice == 2)
ms = 'a' + ((ms - 'a') + 26 - key) % 26;
message[i] = ms;
} else
if (ms >= 'A' && ms <= 'Z') {
if (choice == 1)
ms = 'A' + ((ms - 'A') + key) % 26;
if (choice == 2)
ms = 'A' + ((ms - 'A') + 26 - key) % 26;
message[i] = ms;
}
}
if (choice == 1)
printf("\nEncrypted message: %s\n", message);
if (choice == 2)
printf("\nDecrypted message: %s\n", message);
}
return 0;
}
@ddisec 我在你的代码中注意到 3 mistakes
。
首先是你的 scanf(" %c", message);
。这里你必须使用 %s
(String).
其次结果打印语句应该在for-loop
.
之外
第三次将 if(ms >= 'a' && ms <= 'z'&& choice == 2)
放在 if (ms >= 'a' && ms <= 'z' && choice == 1)
中没有任何意义。
试试这个更正后的代码:-
#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);
getchar(); // to handle unwanted newline.
printf("Enter a message to process: ");
scanf("%49[^\n]", message);
printf(" \nEnter key:");
scanf("%d", &key);
for (i = 0; message[i] != '[=10=]'; ++i)
{
ms = message[i];
if (ms >= 'a' && ms <= 'z' && choice == 1)
{
ms = ms + key;
}
else if (ms >= 'a' && ms <= 'z' && choice == 2)
{
ms = ms - key;
}
else if (ms > 'z')
{
ms = ms - 'z' + 'a' - 1;
}
else if (ms >= 'A' && ms <= 'Z' && choice == 1)
{
ms = ms + key;
}
else if (ms >= 'A' && ms <= 'Z' && choice == 2)
{
ms = ms - key;
}
else if (ms > 'Z')
{
ms = ms - 'Z' + 'A' - 1;
}
message[i] = ms; // Only single modification code needed.
}
if (choice == 1)
{
printf(" \nEncrypted message: %s", message);
}
else if (choice == 2)
{
printf(" \nDecrypted message: %s", message);
}
}
我下面的程序在 C 中执行凯撒密码。出于某种原因,在用户输入消息后,printf(" \nEnter key:")
和
scanf("%d", &key)
语句得到 "jumped" 结束。我的想法与输入缓冲区有关,输入的字符和换行符导致跳转(因此 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] != '[=10=]'; ++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);}
}
}
您的代码中存在多个问题:
您输入消息的方式不正确:
scanf(" %c", message);
将单个字节读入message
第一个元素,甚至没有使其成为 C 字符串。改用它来阅读带有嵌入空格的消息:scanf("%49[^\n]", message);
其余代码中存在逻辑错误:例如,您在仅在
choice == 1
...[= 时执行的块内测试choice == 2
16=]
这是一个简化版本:
#include <stdio.h>
int main() {
char message[50];
int i, key, choice;
printf("Enter 1. to Encrypt, or 2. to Decrypt: ");
if (scanf("%d", &choice) != 1)
return 1;
printf("\nEnter a message to process: ");
if (scanf("%49[^\n]", message) != 1)
return 1;
printf("\nEnter key:");
if (scanf("%d", &key) != 1)
return 1;
for (i = 0; message[i] != '[=11=]'; ++i) {
int ms = message[i];
if (ms >= 'a' && ms <= 'z') {
if (choice == 1)
ms = 'a' + ((ms - 'a') + key) % 26;
if (choice == 2)
ms = 'a' + ((ms - 'a') + 26 - key) % 26;
message[i] = ms;
} else
if (ms >= 'A' && ms <= 'Z') {
if (choice == 1)
ms = 'A' + ((ms - 'A') + key) % 26;
if (choice == 2)
ms = 'A' + ((ms - 'A') + 26 - key) % 26;
message[i] = ms;
}
}
if (choice == 1)
printf("\nEncrypted message: %s\n", message);
if (choice == 2)
printf("\nDecrypted message: %s\n", message);
}
return 0;
}
@ddisec 我在你的代码中注意到 3 mistakes
。
首先是你的 scanf(" %c", message);
。这里你必须使用 %s
(String).
其次结果打印语句应该在for-loop
.
第三次将 if(ms >= 'a' && ms <= 'z'&& choice == 2)
放在 if (ms >= 'a' && ms <= 'z' && choice == 1)
中没有任何意义。
试试这个更正后的代码:-
#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);
getchar(); // to handle unwanted newline.
printf("Enter a message to process: ");
scanf("%49[^\n]", message);
printf(" \nEnter key:");
scanf("%d", &key);
for (i = 0; message[i] != '[=10=]'; ++i)
{
ms = message[i];
if (ms >= 'a' && ms <= 'z' && choice == 1)
{
ms = ms + key;
}
else if (ms >= 'a' && ms <= 'z' && choice == 2)
{
ms = ms - key;
}
else if (ms > 'z')
{
ms = ms - 'z' + 'a' - 1;
}
else if (ms >= 'A' && ms <= 'Z' && choice == 1)
{
ms = ms + key;
}
else if (ms >= 'A' && ms <= 'Z' && choice == 2)
{
ms = ms - key;
}
else if (ms > 'Z')
{
ms = ms - 'Z' + 'A' - 1;
}
message[i] = ms; // Only single modification code needed.
}
if (choice == 1)
{
printf(" \nEncrypted message: %s", message);
}
else if (choice == 2)
{
printf(" \nDecrypted message: %s", message);
}
}