首页 > 解决方案 > 当我使用gets时,我的C程序不会停止填充向量

问题描述

我正在尝试使用非常简单的脚本(只需在字母表中向前移动三个字母)制作一个加密和解密程序。为此,我需要使用指针,当我尝试向用户询问他想要加密的短语时出现了问题。这是代码,错误出现在 scanf 行中的“加密”功能上。

#include <stdlib.h>
#include <locale.h>
#include <string.h>
#include <ctype.h>

#define foreach(item, array) \
    for(int keep = 1, \
            count = 0,\
            size = strlen(array); \
        keep && count != size; \
        keep = !keep, count++) \
      for(item = (array) + count; keep; keep = !keep)

void* encrypt(char *phrase, char *alphabet);

void* decrypt(char *phrase, char *alphabet);

int main() {
    setlocale(LC_ALL, "Portuguese");
    char alphabet[27] = {"abcdefghijklmnopqrstuvwxyz"};
    char phrase[100];

    int menu = -1;

    while(menu != 3)
    {
        printf("----------------------CAESAR'S CIPHER----------------------\n");
        printf("1- Encrypt a text.-----------------------------------------\n");
        printf("2- Decrypt a text.-----------------------------------------\n");
        printf("3- Exit program.-------------------------------------------\n");

        printf("Choose an action: ");
        scanf("%d", &menu);

        if(menu == 1)
        {
            encrypt(phrase, alphabet);
        }
        else if(menu == 2)
        {
            decrypt(phrase, alphabet);
        }

    }
}

void* encrypt(char *phrase, char *alphabet)
{

    printf("TYPE THE PHRASE YOU'D LIKE TO ENCRYPT TO CAESAR'S CIPHER: ");
    gets(phrase);
    printf("HERE'S THE ENCRYPTED TEXT: ");

    foreach(char *p, phrase) {
        printf("%v", *p);
            *p = tolower(*p);
            foreach(char *a, alphabet) {
                    if (*p == *a) {
                        if(*p != 'X' && *p != 'Y' && *p != 'Z')
                        {
                            a += 3;
                            printf("%c", *a);
                        }
                        else if(*p == 'X')
                        {
                            printf("A");
                        }
                        else if(*p == 'Y')
                        {
                            printf("B");
                        }
                        else if(*p == 'Z')
                        {
                            printf("C");
                        }
                    }
            }
    }

}

标签: cpointerschar

解决方案


如果您想读入一行文本并解析它,请编写读入一行并解析它的代码。您有读入数字的代码,然后有读入一行的代码。因此,当您按下“1<enter>”时,读取数字的代码读取 1,读取一行的代码仅读取 enter 键并获得一个空行。

    printf("Choose an action: ");
    scanf("%d", &menu); // this consumes the 1 that you push

    if(menu == 1)
    {
        encrypt(&phrase, &alphabet); // the gets here consumes the enter that you push

推荐阅读