程序正在跳过fgets而不允许输入

时间:2016-02-06 22:55:58

标签: c input io scanf fgets

基本上如标题所示..当我的程序从控制台运行时,它会询问您是否要加密或解密..当我输入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而不是等待/允许用户输入任何答案..为什么?

2 个答案:

答案 0 :(得分:3)

scanf(" %c", &answer);行在输入缓冲区中留下newline,由fgets占用。 " %c"中的前导空格消耗前导空格,但不消耗尾随空格。

您可以使用newline"%*c"格式说明符删除scanfnewline读取#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()查看换行符并返回。