在C ++中检测ENTER键

时间:2017-03-15 19:22:37

标签: c++

我有一个这样的程序,

char name[100];
char age[12];
cout << "Enter Name: ";
cin >> name;

cout << "Enter Age: ";
cin >> age;

现在age是一个可选字段,因此用户只需按ENTER键并将该值设为NULL即可。但问题是,cin不接受ENTER键,只是等待有效的键盘字符或数字输入。

我认为问题是因为cin需要有效的输入,因此永远存在。

所以我尝试了以下方法来检测年龄的ENTER按键。

cout << "Enter Age: ";
if (cin.get() == '\n') {
            cout << "ENTER WAS PRESSED" << endl;
        }

现在用户在输入NAME后按下ENTER键,直接进入IF状态。

我也尝试过:

getline(cin, age);

但这也不会停留在等待用户输入的cout << "Age: ";

用户可以是有效年龄,也可以只按ENTER键不输入年龄。

以下代码:

cout << "Enter Name: ";
        cin >> name;

        cout << "Enter Age: ";
        if (cin.get() == '\n') {
            cout << "ENTER WAS PRESSED" << endl;
        }

输出是:

Enter Name: asdf
Enter Age: ENTER WAS PRESSED

我希望光标在输入年龄:_

等待

我该怎么做?

7 个答案:

答案 0 :(得分:3)

你试过这个吗?:

cout << "Press Enter to Continue";
cin.ignore();

还可以查看this question

答案 1 :(得分:0)

你可能想要cin到char变量然后检查它是否是ENTER键,如果没有,继续获取字符并将它们变成int(使用字符减法和所有这些)。这不是一个非常漂亮的解决方案,但它是我头脑中的第一件事。

答案 2 :(得分:0)

您的代码有几个问题:

  1. 您正在使用operator>>缓冲区调用char[],而不会受到缓冲区溢出的影响。使用std::setw()指定读取期间的缓冲区大小。否则,请使用std::string代替char[]

  2. cin >> name只读取第一个以空格分隔的单词,在输入缓冲区中留下任何剩余数据,包括 ENTER ,这是然后由cin >> age选中,而不等待新的输入。为避免这种情况,您需要致电cin.ignore()以丢弃任何未读数据。否则,请考虑使用cin.getline()代替(std::getline()代替std::string),这会消耗包括换行符在内的所有内容,但不会输出换行符(您应该考虑将此用于{至少{1}}值,以便用户可以在其中输入带空格的名称。)

  3. 默认情况下,name在读取新值并包含换行符之前会跳过前导空格。您可以按 ENTER operator>>将很乐意等待,直到输入其他内容。为避免这种情况,您可以使用operator>>,但在读取字符数据时会产生不必要的副作用 - 在输入缓冲区中会留下前导空格,这会导致std::noskipws在读取空白字符时停止读取在读取任何用户输入之前。因此,为避免这种情况,您可以在调用operator>>之前使用cin.peek()检查输入的换行符。

  4. 尝试更像这样的事情:

    cin >> age

    或者:

    #include <iostream>
    #include <limits>
    #include <iomanip>
    
    char name[100] = {0};
    char age[12] = {0};
    
    std::cout << "Enter Name: ";
    std::cin >> std::setw(100) >> name;
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    /* or:
    if (!std::cin.getline(name, 100))
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    */
    
    std::cout << "Enter Age: ";
    if (std::cin.peek() != '\n')
        std::cin >> std::setw(12) >> age;
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    

答案 3 :(得分:0)

只需使用:

import React, {Component} from 'react';
import {View, Text, TextInput, StyleSheet, TouchableOpacity, Alert} from 'react-native';

class GBTextInput extends Component {
  constructor(props) {
    super(props);
    const {placeholder, text, label} = props;
    this.state = {
      text,
      placeholder,
      label
    };

    this.handleChange = this.handleChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  handleChange(event) {
    this.setState({text});
  }

  handleSubmit(event) {
    Alert.alert(
      'Title'+this.state.text,
      'I am a message'
    );
    event.preventDefault();
  }

  render() {
    const {text, placeholder, label} = this.state;
    const {containerStyle, labelStyle, inputStyle, buttonStyle} = styles;

    return(
      <View>
      <View style={containerStyle}>
        <View style={labelStyle}>
          <Text>{label}</Text>
        </View>
        <TextInput
          placeholder={placeholder}
          style={inputStyle}
          onChangeText={(text) => this.handleChange}
          value={text}
          onSubmitEditing={(text) => this.handleSubmit}
        />
      </View>
      <TouchableOpacity style={buttonStyle} onPress={this.handleSubmit}>
        <Text>PRESS ME</Text>
      </TouchableOpacity>
      </View>

    );

  }
}

const styles= StyleSheet.create ({
  containerStyle: {
    flexDirection: 'row',
    margin: 6
  },
  buttonStyle: {
    alignSelf: 'stretch',
    margin: 6,
    padding: 6,
    height: 40,
    borderRadius: 10,
    alignItems: 'center',
    justifyContent: 'center',
    borderColor: 'blue',
    borderWidth: StyleSheet.hairlineWidth
  },
  labelStyle: {
    height: 40,
    width: '20%',
    alignItems: 'flex-end',
    justifyContent: 'center',
    paddingRight: 6
  },
  inputStyle: {
    height: 40,
    width: '80%',
    borderColor: 'gray',
    borderRadius: 10,
    borderWidth: StyleSheet.hairlineWidth,
    position: 'relative',
    paddingLeft: 6
  },
});

export default GBTextInput;

http://www.cplusplus.com/reference/cstdio/fgetc/上查看更多信息

答案 4 :(得分:0)

一种方法是使用getline读取输入,然后测试输入字符串的长度。如果他们仅按Enter键,则行的长度将为0,因为默认情况下,getline会忽略换行符。

std::string myString = "";

do {
     std::cout << "Press ENTER to exit" << std::endl;
     std::getline(std::cin, myString);
} while (myString.length() != 0);

std::cout << "Loop exited." << std::endl;

答案 5 :(得分:0)

您可以包含“ conio.h”库 并使用getch();

#include <conio.h>
#include <iostream>

using namespace std;

int main(){

cout << "press enter";
getch();

return 0;

}

答案 6 :(得分:0)

使用cin.get()时,编译器将使用最近使用的Enter(即在输入名称时按下Enter键)。因此您需要使编译器避免最后输入Enter键,因此您需要在使用cin.ignore()之前包含cin.get()