我正在尝试编写一个函数,该函数获取字符串作为其参数,搜索其中是否存在“p”或“e”,将其拆分为单独的字符串,将“ p ”替换为“ 3.14 ... ”和“ e ”与“ 2.71 ... ”,将所有字符串转换为double,然后将所有转换后的字符串相乘。例如,当参数为“ 123.45p4e9.2 ”时,函数会将其拆分为“ 123.45 ”,“ p ”,“ 4 “,” e “和” 9.2 “,然后用常量替换字符:” 123.45 “,” 3.14 ... “,” 4 “,” 2.71 ... “和” 9.2 “,之后转换为全部他们是双倍和倍数:123.45 * 3.14 * 4 * 2.71 * 9.2。
问题在于,当我给它一个只有一个数字的字符串时,没有任何'p'或'e'(例如“ 2.4 ”或“ 32 “),它返回0.但是,当我给它” e “,” p “或” ep “时,它返回” 2.71 ... “,” 3.14 ... “或” 8.53 ... “,所以在这种情况下它运作良好。当我尝试用数字和字符的组合给它字符串时,问题就出现了。当我输入“ 3p ”时,函数返回正确的结果:“ 9.42 ... ”。另一方面,当我输入“ p3 ”时,它会返回“3.14 ...”,尽管它仍然应该是“ 9.42 ... ”。看起来它根本不适用于数字,如果出现'e'或'p',它似乎不会在第一个字符后发现数字。
有人可以查看代码并找出问题所在吗?我一直试图找到它几个小时,但在逻辑方面,一切似乎都没问题。
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <string>
#include <math.h>
#include <windows.h>
#define NULL "null"
using namespace std;
double stale(string w);
int main(){
//Testing the function
string liczba;
cout << "Type the number: ";
cin >> liczba;
double wynik = stale(liczba);
cout << endl << "Result: " << wynik << endl << endl;
system("PAUSE");
}
double stale(string w){
string *wartosc = new string[w.length()]; //Dynamic string array
for(int i = 0; i < w.length(); i++){ //String array is filled with "null"
wartosc[i] = NULL;
}
{ //Bracket only to control lifespawn of liczba and element_wartosc variables
string liczba = NULL; // There'll be built a number between e and p
int element_wartosc = 0;
for(int i = 0; i < w.length(); i++){ //Searching argument string for e and p
switch(w[i]){
case 'p':
if(liczba != NULL){ //Ends generating number, which isn't e or p
wartosc[element_wartosc] = liczba;
liczba = NULL;
element_wartosc++;
wartosc[element_wartosc] = "3.14159265358979323846";
element_wartosc++;
}else{
wartosc[element_wartosc] = "3.14159265358979323846";
element_wartosc++;
}
break;
case 'e':
if(liczba != NULL){ //Ends generating number, which isn't e or p
wartosc[element_wartosc] = liczba;
liczba = NULL;
element_wartosc++;
wartosc[element_wartosc] = "2.71828182845904523536";
element_wartosc++;
}else{
wartosc[element_wartosc] = "2.71828182845904523536";
element_wartosc++;
}
break;
default:
if (liczba == NULL){
liczba = w[i]; //Starts filling liczba variable with first character
}else if(w[i] == '\0'){
wartosc[element_wartosc] = liczba; //Ends generating number on argument string end
break;
}else{
liczba = liczba + w[i]; //Builds the number
}
}
}
}
double wynik = 0; //There will be the result
for(int i = 0; i < w.length(); i++){
if(wartosc[i] == NULL){ //wartosc array was filled earlier with "null" strings, to distinguish it from entered numbers
continue;
}else{
double liczba = stod(wartosc[i]); //Converting strings onto doubles
if(wynik == 0){
wynik = liczba; //Starting multiplification
}else{
wynik *= liczba; //Multiplification
}
}
}
delete[] wartosc; //Removing dynamic array
return wynik; //The result is returned
}
答案 0 :(得分:0)
我没有查看你的代码,但根据你的描述,我会写的是
double stale(string w){
double result = 1;
std::replace_if( w.begin(), w.end(),
[&result] ( char & c ) {
if ( c == 'e' ) {
result *= 2.718;
return true;
} else if ( c == 'p' ) {
result *= 3.141;
return true;
} else
return false;
}, ' ' );
auto strs = split( w, ' ' );
for ( auto & str : strs ) {
if ( str != "" ) {
result *= stod( str );
}
}
return result;
}
基本上它会在字符串中找到所有'p'
和'e'
并将它们相乘,然后用空格替换它们,然后我将字符串拆分并乘以其余部分。
拆分功能基于this thread, answer #2。我测试了一下它应该给你预期的结果。