C 程序跳过 printf 和 scanf 语句

标签 c encryption printf scanf fflush

下面的程序用 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);}
    }
}

最佳答案

@ddisec 我已经注意到3 mistakes在您的代码中。

首先是你的scanf(" %c", message); .这里你必须使用%s (字符串)

其次,结果打印语句应该在 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] != '\0'; ++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 和 scanf 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50555256/

相关文章:

c - 有符号/无符号字符之间的区别

c - 我需要重命名文件,但我不明白出了什么问题,文件已加密,但名称没有改变

C++:将类传递给 vararg 函数

c++ - 使用fprintf来存储流

c - GCC 按位属性

c - 为什么我只收到第一个地址字节? (I2C 协议(protocol))

c - ESP 32 中断问题

java - 使用 XOR JAVA 解密仅在第一行工作

java - 使用 Md5 保存密码

c++ - 理解printf格式规范中的%03.3u