我有一个这样的程序,
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
我希望光标在输入年龄:_
等待我该怎么做?
答案 0 :(得分:3)
答案 1 :(得分:0)
你可能想要cin到char变量然后检查它是否是ENTER键,如果没有,继续获取字符并将它们变成int(使用字符减法和所有这些)。这不是一个非常漂亮的解决方案,但它是我头脑中的第一件事。
答案 2 :(得分:0)
您的代码有几个问题:
您正在使用operator>>
缓冲区调用char[]
,而不会受到缓冲区溢出的影响。使用std::setw()
指定读取期间的缓冲区大小。否则,请使用std::string
代替char[]
。
cin >> name
只读取第一个以空格分隔的单词,在输入缓冲区中留下任何剩余数据,包括 ENTER 键,这是然后由cin >> age
选中,而不等待新的输入。为避免这种情况,您需要致电cin.ignore()
以丢弃任何未读数据。否则,请考虑使用cin.getline()
代替(std::getline()
代替std::string
),这会消耗包括换行符在内的所有内容,但不会输出换行符(您应该考虑将此用于{至少{1}}值,以便用户可以在其中输入带空格的名称。)
默认情况下,name
在读取新值并包含换行符之前会跳过前导空格。您可以按 ENTER ,operator>>
将很乐意等待,直到输入其他内容。为避免这种情况,您可以使用operator>>
,但在读取字符数据时会产生不必要的副作用 - 在输入缓冲区中会留下前导空格,这会导致std::noskipws
在读取空白字符时停止读取在读取任何用户输入之前。因此,为避免这种情况,您可以在调用operator>>
之前使用cin.peek()
检查输入的换行符。
尝试更像这样的事情:
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;
答案 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()
。