2017-05-10 29 views
0

我想標記一個字符串,例如每次出現「」(空格)時,顯示「5 + 3 * 2 - 4」。操作員標誌應保存在不同的命名字符變量中。數字在不同的已命名的浮點變量中。 例如令牌化字符串並將令牌放入不同數據類型的變量中?

float num_1 = 5; 
float num_2 = 3; 
float num_3 = 2; 
float num_4 = 4; 

char op_1 = '+'; 
char op_2 = '*'; 
char op_3 = '-'; 

這是我迄今爲止的標記器。但是這隻能打印控制檯中的數字和操作。那不是我想要的。

std::vector<std::string> strings; 
    std::istringstream f("3 + 2 * 4 "); 
    std::string s; 
    while (std::getline(f, s, ' ')) { 
     std::cout << s << std::endl; 
     strings.push_back(s); 
    } 

我把這個東西用了一個永恆的東西,但是我從來沒有發現對我有用的東西。即時通訊只是一個初學者和大多數代碼我GOOGLE了太難,我真的明白,或者它只是不是我所需要的:/

+0

下面是有關令牌化的很好的信息:http://stackoverflow.com/questions/53849/how-do-i-tokenize-a-string-in-c。我建議從結果上反思:你想用這個來達到什麼目的?什麼數據結構將是必要的?然後,如何計算來自輸入的數據。 – Gerriet

+0

將每個字符和整數存儲在不同變量中的唯一方法是手動聲明每個變量併爲其分配一個值。如果您嘗試標記的表達式變大,則需要更多變量。考慮使用'array'或'vector'來存儲你的值。 – alejandrogiron

回答

0

看來你最有完成任務的。你缺少的是一種方法來知道子字符s是一個運算符還是一個數字。您可以輕鬆地爲此編寫輔助函數。這是你的代碼的修改版本,應該可以正常工作。就投入而言,這當然不是防彈的,但它應該讓你走。

// Checks if the string is an operator 
bool IsOperator(std::string const& str) 
    { 
    if (1 != str.size()) 
     return false; 

    if (str[0] == '*' || str[0] == '-' || str[0] == '+' || str[0] == '/') 
     return true; 

    return false; 
    } 

// Converts the string into a float 
float ParseValue(std::string const& str) 
    { 
    return stof(str); 
    } 

int main() 
    { 
    float* = n 
    std::vector<float> values; 
    std::vector<char> operators; 

    std::istringstream f("3 + 2 * 4 "); 
    std::string s; 
    while (std::getline(f, s, ' ')) 
     { 
     if (IsOperator(s)) 
      operators.push_back(s[0]); 
     else 
      values.push_back(ParseValue(s)); 
     } 

    return 0; 
    } 

編輯 - 與數組。

int main() 
    { 
    float values[100]; 
    char operators[100]; 

    size_t valuesIdx = 0; 
    size_t operatorsIdx = 0; 

    std::istringstream f("3 + 2 * 4 "); 
    std::string s; 
    while (std::getline(f, s, ' ')) 
     { 
     if (IsOperator(s)) 
      { 
      operators[operatorsIdx] = s[0]; 
      ++operatorsIdx; 
      } 
     else 
      { 
      values[valuesIdx] = ParseValue(s); 
      ++valuesIdx; 
      } 
     } 

    return 0; 
    } 
+0

thx這個答案。我試了一下代碼並打印了矢量的內容以證明它的工作。是的,它確實*豎起大拇指,但如果我想使用數組,而不是。這也是可能的嗎? – neo1t7

+0

@ neo1t7它當然是。你可以保留索引來知道你在數組中的位置(我已經在示例中添加了一個編輯來顯示你)。矢量更方便,因爲如果它沒有足夠的空間,它會自動調整大小。 – AlexG

0

如果我猜對了,你需要的是有一個變量,存儲sstrings在每次迭代。你的問題是getline()將你設置的參數分隔符設置爲' '並停在它。因此,例如:

s = '3'; // First iteration 

,然後只在while停止,因爲f商店一行。 您應該考慮使用strtok_r()或燒焦迭代char和它們存儲到一個字符,直到遇到' '