如何只计算字符串

时间:2015-09-17 09:42:29

标签: c++ string stringstream

我有一小段代码,我正在尝试处理一个字符串,并为字符串中每个以空格分隔的数字添加一个代码。但是,如果它遇到不是整数的东西,它会立即停止计数器,这不是我想要它做的。

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

int counter;

int main()
{           
cout << "Please input string: ";
string input;
getline(cin, input);
istringstream ss(input);

    int num;
    while(ss >> num)
    {
        counter++;
    }

    cout << "Amount of integers in string: " << counter << endl;

}

例如,如果我输入字符串3 4 5,它将正确返回字符串中的3个整数,但如果我输入类似3 4 x 6 t 8的内容,则会说我在字符串中只有两个整数。

我该如何解决这个问题?

6 个答案:

答案 0 :(得分:4)

ss >> num会在遇到非整数时将流置于错误状态,这会使while (ss >> num)终止。

与许多其他问题一样,这可以通过引入某种间接的某种程度来解决 在这种情况下,您可以通过第二个流使用间接:

istringstream ss(input);
string word;
while (ss >> word)
{
    istringstream maybenumber(word);
    int number = 0;
    if (maybenumber >> number)
    {
        counter++;
    }
}

答案 1 :(得分:2)

operator>>返回转换为bool的流,指示是否设置了错误标志;这就是你的while循环中使用的内容。如果流中读取位置的字符序列不是int,则设置失败位,并且流在循环中转换为false,结束程序。

您可能想要在循环中检查该位。如果它是失败位(而不是eof),请将其清除,读取整数之间的字符串,然后继续循环。

你对自己的规格并不十分准确;对于字符串“123 abx2”,上述算法将返回1。如果要在此处返回2或4,则必须检查单个字符级别的数据。

答案 2 :(得分:1)

使用isdigit

std::string str = "4 a h a 1 23";
size_t countNumbers(0);
for ( size_t i = 0; i < str.size(); i++ )
{ 
  if( isdigit(str[i]) && ( i == 0 || isspace(str[i-1]) ) )  
  { countNumbers++; }
}
std::cout << "There are " << countNumbers << " numbers" << 
             " in the string \"" << str << "\"." << std::endl;

答案 3 :(得分:1)

您需要检查读取输入值是否为空数字后跟空格或字母,然后递增计数器。可能的实现看起来像这样

int main()
{           
    cout << "Please input string: ";
    string input;
    getline(cin, input);

    int counter = 0;
    if(input.size() == 1 && isdigit(input[0])){
        counter ++;
    }else{
        for(int i = 1; i < input.size(); ++i){
            // works for all but the last element
           if(isdigit(input[i-1]) && (isspace(input[i]) || isalpha(input[i]))) counter++;
        }
        // check the last element
        if(isdigit(input[input.size()-1])) counter ++;
    }

    cout << "Amount of integers in string: " << counter << endl;
}

注意:

上面的代码甚至考虑一个整数是非整数字符的字符串,例如:5dkjfkd

答案 4 :(得分:0)

在while条件中,您应该检查字符串的结尾,而不是数字。 然后,检查是否是一个数字来增加你的计数器。

答案 5 :(得分:0)

只要遇到非整数,您的while条件的计算结果为false。要纠正此问题,请循环直到字符串结尾,并且只有在遇到整数时才增加计数器。

有点像,

bool checknum (string x)
{
    for (auto &i: x) if (!isdigit(i)) return false;
    return true;
}

string num;
while (!ss.eof())
{
    getline (ss, num, ' ');
    if (checknum(num)) counter++;
}