C程序跳过printf和scanf语句

时间:2018-05-27 18:28:56

标签: c encryption printf scanf fflush

我的程序在C中使用Caesar的密码。出于某种原因,在用户输入消息后,printf(" \nEnter key:")scanf("%d", &key)语句得到了跳跃"过度。我的想法是与输入缓冲区相关的东西,其中输入了char和换行符导致跳转(因此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);}
    }
}

2 个答案:

答案 0 :(得分:1)

@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);
    }
}

答案 1 :(得分:0)

您的代码中存在多个问题:

  • 输入消息的方式不正确:scanf(" %c", message);将单个字节读入message第一个元素,甚至不使其成为C字符串。改为使用它来读取带有嵌入空格的消息:

    scanf("%49[^\n]", message);
    
  • 其余代码中存在逻辑错误:例如,您在块内测试choice == 2仅在choice == 1 ...

这是一个简化版本:

#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] != '\0'; ++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;
}