C++ C++;插入数字直到指定符号

C++ C++;插入数字直到指定符号,c++,arrays,variables,C++,Arrays,Variables,我试图编写一段代码,要求我一个接一个地输入数字,当插入某个字符(在本例中为“x”)时,它将停止循环。但当我插入那个字符时,它就开始用“insertnumber”向我发送垃圾邮件。我认为错误在于我试图在int数组中插入一个char,但我想不出解决方法 long int numbers[100]={0}; char h='y'; int index=0; do { cout << "Insert Number : "; cin >> numbers[index

我试图编写一段代码,要求我一个接一个地输入数字,当插入某个字符(在本例中为“x”)时,它将停止循环。但当我插入那个字符时,它就开始用“insertnumber”向我发送垃圾邮件。我认为错误在于我试图在int数组中插入一个char,但我想不出解决方法

long int numbers[100]={0};
char h='y';
int index=0;
do
{
    cout << "Insert Number : ";
    cin >> numbers[index];
    h=(char)numbers[index];
    index++;
}
while(h!='x');
长整数[100]={0};
charh='y';
int指数=0;
做
{
cout>数字[索引];
h=(字符)数字[索引];
索引++;
}
而(h!='x');

您应该将循环编写为:

while(cin >> numbers[index]) 
   index++;
它将读取所有整数,直到您输入一些无效输入,无论是
'x'
还是任何其他字符。现在,如果您想跳过所有无效的输入并继续读取整数(可能是在无效输入之后),并且只想考虑代码>“x”<代码>退出循环,那么用另一个循环将上述循环包装为:

char ch;
do
{
   while(cin >> numbers[index]) 
       index++;
   cin.clear(); //clear the error flags, so you can use cin to continue reading
   cin >> ch; //read the invalid character
} while(ch != 'x');

一条建议:与长整数[100]相比,更喜欢使用
std::vector
。如果用户输入的整数超过了
100
,那么您的程序将被破坏。

发生这种情况是因为“x”不是一个数字,
cin>>数字[索引]操作失败,而不使用该数据。因此循环继续,得到相同的
x
,再次失败,一切重新开始。您可以检查输入操作的结果,如下所示:

#include <iostream>

using namespace std;

int main ()
{
    long int numbers[100]={0};
    char h='y';
    int index=0;
    do
    {
        cout << "Insert Number : ";
        if (cin >> numbers[index])
        {
            h=(char)numbers[index];
            index++;
        }
        else
        {
            cout << "Hey, that was not a number! Bye." << endl;
            break;
        }
    }
    while(h!='x');
}
#包括
使用名称空间std;
int main()
{
长整数[100]={0};
charh='y';
int指数=0;
做
{
cout>数字[索引])
{
h=(字符)数字[索引];
索引++;
}
其他的
{

cout因为您试图读取整数,任何非数字的字符都无法转换为数字,并将阻塞输入-您将得到一个错误,坏字符将不会从流中删除。下次尝试读取时,您将得到相同的错误。

如果您需要一个数字或字符串,请始终将输入作为一个数字读取字符串,如果字符串不是“x”,则尝试将其转换为数字:

#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
std::向量数;
std::字符串行;
while(std::getline(std::cin,line)&&line!=“x”){
std::istringstream输入(行);
长整型值;
//检查之后是否只有一个数字,没有其他数字
if((输入>>值)&&input.get()==std::char\u traits::eof()){
数字。推回(值);
}否则{

std::无法读取字符串,那么你就知道该怎么做了。在这种情况下,垃圾邮件意味着什么?你会陷入一个无休止的循环吗?你不能将字符读入整数。试着用另一种方法来做。另外:你认为输入中的文字
x
被转换成什么?按照你写的方式,如果用户输入120,它将退出(因为对一个字符施法120会得到“x”)。@EdwardLoper:是的。但我没有写:)所有这个用“x”的故事都是个坏主意。@这有未定义的行为(但可能会永远循环);一旦内部循环失败,
cin
处于错误状态,必须先清除该状态,然后才能接受任何进一步的输入。@JamesKanze:谢谢。我忘了。:-)
#include <vector>
#include <string>
#include <sstream>
#include <iostream>    

int main(int argc, char *argv[])
{
    std::vector<long int> numbers;
    std::string line;
    while(std::getline(std::cin, line) && line != "x") {
        std::istringstream input(line);
        long int value; 
        // Check that there is only a number with nothing else after
        if((input >> value) && input.get() == std::char_traits<char>::eof()) {
            numbers.push_back(value);
        } else {
            std::cout << "Invalid Entry, please retry" << std::endl;
        }
    }

    //...

    return 0;
}