C++ 需要用户输入字符串/检查字符串长度(C+;+;)

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

我需要从用户那里接受一个由5个数字组成的字符串(只有5个)。 我应该用吗

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循环并在数字有效时中断)。这听起来很像家庭作业这听起来很像家庭作业