基本上如标题所示..当我的程序从控制台运行时,它会询问您是否要加密或解密..当我输入e或E时,它会创建一个新的空白行(直到我输入了某种文字),然后一次显示“输入文字”和“输入密钥”行。
因此,在控制台中它看起来像:
你想(E)ncrypt还是(D)ecrypt? ë
asdf jkl; < ----随机用户输入以使程序继续..
输入您要加密的文本:输入用于加密的密钥:(用户输入)
然后程序退出..
//message to be encrypted
char text[250];
//word to use as the key
char key[50];
//stores the encrypted word
char encrypted[250];
char answer;
printf("Would you like to (E)ncrypt or (D)ecrypt? ");
scanf(" %c", &answer);
if(answer == 'e' || answer == 'E')
{
printf("Enter the text you want to encrypt : ");
fgets(text, 250, stdin);
printf("Enter a key to use for encryption : ");
fgets(key, 50, stdin);
printf("Encrypted text : ");
//code that encrypts the text here
}
因此问题在于,它正在完全跳过fgets而不是等待/允许用户输入任何答案..为什么?
答案 0 :(得分:3)
第scanf(" %c", &answer);
行在输入缓冲区中留下newline
,由fgets
占用。 " %c"
中的前导空格消耗前导空格,但不消耗尾随空格。
您可以使用newline
中"%*c"
格式说明符删除scanf
,newline
读取#include <stdio.h>
int main(void)
{
char answer;
char text[50] = {0};
scanf(" %c%*c", &answer);
fgets(text, sizeof text, stdin);
printf ("%c %s\n", answer, text);
return 0;
}
但会丢弃它。不需要提供var参数。
package com.practice.Structures;
public class BinarySearchListTree {
TreeListNode root;
TreeListNode head;
public BinarySearchListTree() {
}
public void add(int data) {
TreeListNode node = new TreeListNode(data);
if(null == this.root) {
this.root = node;
this.head = node;
return;
}
insertNode(node, this.root, this.root);
}
private void insertNode(TreeListNode node, TreeListNode parent, TreeListNode hold) {
if(parent.getData() >= node.getData()) {
if(null == parent.leftChild) {
addLeftChild(node, parent, hold);
} else {
if(parent.leftChild.getData() >= hold.getData()) {
insertNode(node, parent.leftChild, hold);
} else {
insertNode(node, parent.leftChild, parent.leftChild);
}
}
} else {
if(null == parent.rightChild) {
addRightChild(node, parent);
} else {
insertNode(node, parent.rightChild, parent);
}
}
}
public void traverse() {
inOrderTraverse(this.root);
System.out.println();
}
public void printList() {
printNode(this.head);
System.out.println();
}
private void printNode(TreeListNode node) {
if(null != node) {
System.out.print(node.getData() + " ");
printNode(node.next);
}
}
private void inOrderTraverse(TreeListNode node) {
if(node == null) {
return;
}
inOrderTraverse(node.leftChild);
System.out.print(node.getData() + " ");
inOrderTraverse(node.rightChild);
}
private void addLeftChild(TreeListNode child, TreeListNode parent, TreeListNode hold) {
parent.addLeftChild(child);
child.next = parent;
if(parent != hold) {
hold.next = child;
}
if(parent == this.head) {
this.head = child;
}
}
private void addRightChild(TreeListNode child, TreeListNode parent) {
parent.addRightChild(child);
child.next = parent.next;
parent.next = child;
}
}
答案 1 :(得分:2)
来自http://www.cplusplus.com/reference/cstdio/fgets/
&#34;从流中读取字符并将它们作为C字符串存储到str中,直到读取(num-1)个字符或者到达换行符或文件结尾为止,以先发生者为准。&# 34;
您可能在键入E或D后按Enter键。您的scanf()不会使用换行符,因此它将保留在输入流中。 fgets()查看换行符并返回。