C++一道编程哪错了 编写一个程序,输入一个字符串,从字符串中提取有效的数字,输出它们的总和。

#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
double function1(int b1, int b2, string s);
double function2(int b1, int b2, string s);
int main()
{
string s;
int len = s.length();
int i, j, b1, b2=0;
double sum;
sum = 0;
getline(cin, s);
for (i = 0; i < len; ++i)
{

if (s[i] >= '0' && s[i] <= '9')
{
b1 = i;
for (j = b1;j < len;++j)
{
int b2 = 0;
if (s[j] >= '0' && s[j] <= '9')
b2 = j;
else break;
}
sum = sum + function1(b1, b2, s);
i = b2;
}

if (s[i] == 46)
{
b1 = i + 1;
for (j = b1;j < len;++j)
{
if (s[j] >= '0' && s[j] <= '9')
{

b2 = j;
}
else break;
}
sum = sum + function2(b1, b2, s);
i = b2;
}

}
cout << endl << "字符串中有效的数字的总和为:" << sum << endl << endl;
system("pause");

return 0;

}

double function1(int b1, int b2, string s)
{
double sum = 0;

for (int i = b1; i <= b2; ++i)
sum = sum * 10 + ((unsigned __int64)s[i] - '0');

return sum;
}
double function2(int b1, int b2, string s)
{
double sum = 0;
for (int i = b1; i <= b2; ++i)
sum = sum / 10 + ((unsigned __int64)s[i] - '0');
return sum / 10;
}

本来想改一改,改着改着改得太多,重写一个供参考——

代码资料:

//#include "stdafx.h"//If the vc++6.0, with this line.

#include <string>

#include <iostream>

#include <iomanip>

using namespace std;

int function1(int &i, string s){

int sum;

for(sum=0;s[i]>='0' && s[i]<='9';i++)

sum = sum * 10 + s[i] - '0';

return sum;

}

int main(int argc,char *argv[]){

string s;

int len,i,sum=0;

cin >> s;

len = s.length();

for(i = 0; i < len; ++i)

if(s[i] >= '0' && s[i] <= '9'){

sum+=function1(i,s);

i--;

}

cout << endl << "字符串中有效的数字的总和为:" << sum << endl << endl;

system("pause");

return 0;

}

追问

要考虑小数情况

追答

那就改一下吧——

代码资料:

//#include "stdafx.h"//If the vc++6.0, with this line.

#include <string>

#include <iostream>

#include <iomanip>

using namespace std;

double function1(int &i, string s){

double sum,k;

for(sum=0.0;s[i]>='0' && s[i]<='9';i++)

sum = sum * 10 + s[i] - '0';

if(s[i]=='.')

for(k=10.0,i++;s[i]>='0' && s[i]<='9';k*=10,i++)

sum+=(s[i]-'0')/k;

return sum;

}

int main(int argc,char *argv[]){

string s;

int len,i;

double sum=0.0;

cin >> s;

len = s.length();

for(i = 0; i < len; ++i)

if(s[i] >= '0' && s[i] <= '9' || s[i]=='.'){

sum+=function1(i,s);

i--;

}

cout << endl << "字符串中有效的数字的总和为:" << sum << endl << endl;

system("pause");

return 0;

}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-10-19

我觉得你是不是把题目想复杂了,如果是只是记和的话,我觉得只是这样写就可以了

如果是,提取数字的话,这样写就可以了

第2个回答  2019-10-20
我没看完,不过我觉得你的 len赋值是不是太早了,在你还没输入字符串s的时候,你的len=s.length() 似乎值是0吧
第3个回答  2019-10-19
#include<iostream>
#include<cstdlib>

#define BufLen 256

using namespace std;

char buf[BufLen];

int main()
{
const string Digital="0123456789";
string s;
int start=0,end;
long long sum=0;

cin.getline(buf,BufLen);
s.assign(buf);
do
{
start=s.find_first_of(Digital,start);
if(string::npos!=start)
{
end=s.find_first_not_of(Digital,start+1);
if(string::npos==end)
end=s.length();
sum+=atol(s.substr(start,end-start).c_str());
start=end+1;
}
}while(string::npos!=start);
cout<<sum<<endl;
return 0;
}
第4个回答  2019-10-19

1234567891011121314151617181920212223242526272829#include <stdio.h> int main(void) {  char str[100];  int i, s= 0;  printf("请输入一个字符串:");  gets(str);  for(i = 0;  str[i];i ++)  {     if(str[i] >= '0' && str[i] <= '9')      s = s + str[i]-'0';  }  printf("字符串各数字之和为:%d\n",s);  return 0; }

相似回答