c - 当我使用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");
}
}
}
}
}
解决方案
如果您想读入一行文本并解析它,请编写读入一行并解析它的代码。您有读入数字的代码,然后有读入一行的代码。因此,当您按下“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
推荐阅读
- javascript - Suitescript:无法从搜索中获取结果
- python - Python:这个数组元素替换正确吗?
- node.js - 在 find() mongoDB/mongoose 查询结果中格式化日期?
- angular - Angular 8 ngx-cookie 2.4 无法从 FireFox 读取(即使它存在)但适用于 Chrome/Edge
- sql - 寻找一种在 SQL 中过滤这些 UNION 查询结果的方法
- ruby-on-rails - 使用 Faker 时 Rspec 'trait 未注册错误
- c++ - winapi 中的 MailSlot 问题,ReadFile 不从 mailslot 读取值
- sql - 来自另一个 INNER JOIN 的 INNER JOIN
- android - 我无法将数据发送到 sqlite 到数据库
- r - httr:curl::curl_fetch_memory(url,handle = handle)中的错误:从对等方接收数据时失败 - FileSize?