C++ 需要用户输入字符串/检查字符串长度(C+;+;)
我需要从用户那里接受一个由5个数字组成的字符串(只有5个)。 我应该用吗C++ 需要用户输入字符串/检查字符串长度(C+;+;),c++,string,input,C++,String,Input,我需要从用户那里接受一个由5个数字组成的字符串(只有5个)。 我应该用吗 istringstream 同样的原因 这样的事我能逃脱吗 int main() { char *InputMain; InputMain=(char *)malloc(5+1); cout << "Enter the number : " <<endl; cin.getline ( InputMain, 5, '\n' ); // In
istringstream
同样的原因
这样的事我能逃脱吗
int main()
{
char *InputMain;
InputMain=(char *)malloc(5+1);
cout << "Enter the number : " <<endl;
cin.getline ( InputMain, 5, '\n' ); // Input goes into InputMain
cout << "The number entered is : " << InputMain <<endl;
cin.get();
}
intmain()
{
char*InputMain;
InputMain=(char*)malloc(5+1);
不幸的是,没有一种可移植的方式来限制C++中字符输入的数量。但是不管你使用什么平台,都会提供一些机制:例如在Windows上,查找。
如果您使用从<代码> CIN < /代码>中输入的普通的旧的C++流,最好将初始文本读入<代码> STD::Stry中,使用<代码> ISTRAMAM和GETLIN(ISTRAAM,String &)这将防止缓冲区溢出,因为<代码>字符串
S在必要时调整大小(您的代码涉及<代码> GETLIN(输入主,5,'\n))
在技术上是安全的,因为它不会在InputMain
中读取超过5个字符,但此代码是脆弱的——如果您以后决定需要6个字符,则很容易忘记更新对malloc()
的调用,从而导致崩溃。此外,您需要记住释放(InputMain)
。但正如我所说的,请改用string
。)
关于解析:
是否使用getline(cin,str)将输入读入字符串
或某个特定于平台的代码,一旦它在那里,您需要以数字的形式将其取出。这就是istringstream
类很有用的地方——它允许您将现有的字符串
视为一个要读取的流,因此您可以使用格式化的输入
操作符:
string str;
if (!getline(cin, str)) {
cerr << "Something went seriously wrong...\n";
}
istringstream iss(str);
int i;
iss >> i; // Extract an integer value from the stream that wraps str
if (!iss) {
// Extraction failed (or a more serious problem like EOF reached)
cerr << "Enter a number dammit!\n";
} else if (i < 1000 || i > 9999) {
cerr << "Out of range!\n";
} else {
// Process i
}
但是,这可能会产生微妙的不良影响;特别是用户键入的行上的任何附加字符(尤其是按Enter键时键入的'\n'
)不幸的是,没有一种可移植的方式来限制C++中输入的字符数。但是不管你使用的是什么平台,都会提供一些机制:例如在Windows上,查找。
如果您使用从<代码> CIN < /代码>中输入的普通的旧的C++流,最好将初始文本读入<代码> STD::Stry中,使用<代码> ISTRAMAM和GETLIN(ISTRAAM,String &)这将防止缓冲区溢出,因为<代码>字符串
S在必要时调整大小(您的代码涉及<代码> GETLIN(输入主,5,'\n))
在技术上是安全的,因为它不会在InputMain
中读取超过5个字符,但此代码是脆弱的——如果您以后决定需要6个字符,则很容易忘记更新对malloc()
的调用,从而导致崩溃。此外,您需要记住释放(InputMain)
。但正如我所说的,请改用string
。)
关于解析:
是否使用getline(cin,str)将输入读入字符串
或某个特定于平台的代码,一旦它在那里,您需要以数字的形式将其取出。这就是istringstream
类很有用的地方——它允许您将现有的字符串
视为一个要读取的流,因此您可以使用格式化的输入
操作符:
string str;
if (!getline(cin, str)) {
cerr << "Something went seriously wrong...\n";
}
istringstream iss(str);
int i;
iss >> i; // Extract an integer value from the stream that wraps str
if (!iss) {
// Extraction failed (or a more serious problem like EOF reached)
cerr << "Enter a number dammit!\n";
} else if (i < 1000 || i > 9999) {
cerr << "Out of range!\n";
} else {
// Process i
}
但是,这可能会产生微妙的不良影响;值得注意的是,用户键入的行上的任何附加字符(尤其是按Enter键键入的'\n'
)将保留在输入缓冲区中,供下一个读取您的意思是我应该使用类似的内容吗?#include#include使用名称空间std;int main(){string-InputMain;cout-InputMain;//-->这也行吗?cout@halluc1nati0n:啊,对不起,我给出了两种替代方法,而不是一种。我将尝试修复帖子以澄清问题。@halluc1nati0n:好的,现在看看。简言之:不,不要使用“cin>>InputMain;”或者使用“int-I;cin>>I;”“string s;getline(cin,s);int i;istringstream iss(s);iss>>i;”@j_random_hacker:我确实喜欢istringstream方法..我添加了ssstream头,代码确实可以编译,但不知何故我无法让它工作。有什么原因吗?@halluc1nati0n:在我添加iostream和ssstream头后,添加“使用命名空间std”;“在下面,并将代码段包装在main()中。如果您希望用户在数字无效时重新输入数字,则显然需要更改错误处理代码(例如,添加while循环并在数字有效时中断)。您的意思是我应该使用类似的代码吗?#include#include使用命名空间std;int main(){string-InputMain;cout-InputMain;//-->这也行吗?cout@halluc1nati0n:啊,对不起,我给出了两种替代方法,而不是一种。我将尝试修复帖子以澄清问题。@halluc1nati0n:好的,现在看看。简言之:不,不要使用“cin>>InputMain;”或者使用“int-I;cin>>I;”“string s;getline(cin,s);int i;istringstream iss(s);iss>>i;”@j_random_hacker:我确实喜欢istringstream方法..我添加了ssstream头,代码确实可以编译,但不知何故我无法让它工作。有什么原因吗?@halluc1nati0n:在我添加iostream和ssstream头后,添加“使用命名空间std”;“在下面,并将代码段包装在main()中。此外,如果您希望用户在数字无效时重新输入数字,则显然需要更改错误处理代码(例如,添加while循环并在数字有效时中断)。这听起来很像家庭作业这听起来很像家庭作业