如何只计算字符串中的整数
How to count only integers in a string
我有一小段我正在尝试处理的代码,它接受一个字符串,并为字符串中由 space 分隔的每个数字加一个到计数器。但是,如果它遇到不是整数的东西,它会立即停止计数器,这不是我想要的。
#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
,它会正确地在字符串中输入 return 3 个整数,但如果我输入类似 3 4 x 6 t 8
的内容,它会说 I only字符串中有两个整数。
我该如何解决这个问题?
在 while 条件中,您应该检查字符串的结尾,而不是数字。
然后,检查它是否是一个数字来增加你的计数器。
使用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;
您需要检查读取的输入值是数字后跟空space还是字母,然后递增计数器。一个可能的实现看起来像这样
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
operator>>
returns 转换为 bool 的流,指示是否设置了任何错误标志;这就是 while 循环中使用的内容。如果流中读取位置的字符序列不是 int,则设置失败位并且流在循环中转换为 false
,程序结束。
您可能想检查循环中的那个位。如果它是失败位(而不是eof),清除它,读出整数之间的字符串,然后继续循环。
您的规格不是很准确;上述算法将 return 1 用于字符串“123 abx2”。如果您想在此处 return 2 或 4,则必须在单个字符级别检查数据。
ss >> num
将在遇到非整数时立即将流置于错误状态,这将使 while (ss >> num)
终止。
像许多其他问题一样,这可以通过引入某种间接级别来解决。
在这种情况下,您可以通过第二个流使用间接寻址:
istringstream ss(input);
string word;
while (ss >> word)
{
istringstream maybenumber(word);
int number = 0;
if (maybenumber >> number)
{
counter++;
}
}
只要遇到非整数,您的 while
条件就会计算为假。要更正此问题,请循环直到字符串末尾,并且仅在遇到整数时才增加计数器。
有点像,
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++;
}
我有一小段我正在尝试处理的代码,它接受一个字符串,并为字符串中由 space 分隔的每个数字加一个到计数器。但是,如果它遇到不是整数的东西,它会立即停止计数器,这不是我想要的。
#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
,它会正确地在字符串中输入 return 3 个整数,但如果我输入类似 3 4 x 6 t 8
的内容,它会说 I only字符串中有两个整数。
我该如何解决这个问题?
在 while 条件中,您应该检查字符串的结尾,而不是数字。 然后,检查它是否是一个数字来增加你的计数器。
使用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;
您需要检查读取的输入值是数字后跟空space还是字母,然后递增计数器。一个可能的实现看起来像这样
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
operator>>
returns 转换为 bool 的流,指示是否设置了任何错误标志;这就是 while 循环中使用的内容。如果流中读取位置的字符序列不是 int,则设置失败位并且流在循环中转换为 false
,程序结束。
您可能想检查循环中的那个位。如果它是失败位(而不是eof),清除它,读出整数之间的字符串,然后继续循环。
您的规格不是很准确;上述算法将 return 1 用于字符串“123 abx2”。如果您想在此处 return 2 或 4,则必须在单个字符级别检查数据。
ss >> num
将在遇到非整数时立即将流置于错误状态,这将使 while (ss >> num)
终止。
像许多其他问题一样,这可以通过引入某种间接级别来解决。
在这种情况下,您可以通过第二个流使用间接寻址:
istringstream ss(input);
string word;
while (ss >> word)
{
istringstream maybenumber(word);
int number = 0;
if (maybenumber >> number)
{
counter++;
}
}
只要遇到非整数,您的 while
条件就会计算为假。要更正此问题,请循环直到字符串末尾,并且仅在遇到整数时才增加计数器。
有点像,
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++;
}