Thread: Please Help me.. Clear the errors and display what is the output??

  1. #1
    Registered User
    Join Date
    Nov 2013
    Posts
    2

    Please Help me.. Clear the errors and display what is the output??

    1. Take any string like this one and read it into memory:
    "I want to by a shirt but it is too expensive. My favorite one is $20.15 and my second favorite one is $15 so I do not know which one to buy"
    2. Step through the string using the function here to try to find the currency and replace the currency with the currency tag which is #c. The following code does all this for you.
    3. Display the output string that should look like this:
    "I want to by a shirt but it is too expensive. My favorite one is #c and my second favorite one is #c so I do not know which one to buy"


    Code:
    
    #include "stdafx.h"
    #include <iostream>
    #include<stdio.h>
    #include <string>
    #include<cctype>
    #include<stdlib.h>
    #include<fstream>
    #include<iterator>
    #include<list>
    #include <functional>
    #include <algorithm>
    #include<vector>
     
    using namespace std;
    
    
    class sample
    {
    public:
      static auto checkForCurrency = [](char *&prevPtr, char *&p)->bool
      {
        char *origPrevPtr = prevPtr;
        char *origPtr = p;
    
    
        static const unsigned char CentSymbol = 155;
       
        static const unsigned char PoundSymbol = 156;
        static const unsigned char YenYuanSymbol = 157;
    
    
        bool retVal = false;
    
    
        if (*p == '$' || *p == '€' || *p == '£' || *p == '¥' || *p == '¢')
    	{
          advance(prevPtr, p, 1);
          if (isNumber(prevPtr, p))
    	  {
            retVal = true;
          } 
    	  else if (*p == TheSpace) 
    	  {
            char *tmpPtr = p;
            advance(prevPtr, p, 1);
            if (isNumber(prevPtr, p))
    		{
              retVal = true;
            } 
    		else
    		{
              p = tmpPtr;
            }
          }
        } 
    	else if(isNumber(prevPtr, p)) {
          if (*p == CentSymbol) {
            advance(prevPtr, p, 1);
            retVal = true;
          } else if (isCurrency(prevPtr, p)) {
            retVal = true;
          } else if (*p == TheSpace) {
            char *tmpPtr = p;
            advance(prevPtr, p, 1);
            if (*p == CentSymbol) {
              advance(prevPtr, p, 1);
              retVal = true;
            } else if(isCurrency(prevPtr, p)) { 
              retVal = true;
            } else {
              p = tmpPtr;
            }
          }
        }
    
    
        if (retVal) {
          memset(origPtr, TheSpace, p - origPtr);
          *(origPtr + 0) = '#';
          *(origPtr + 1) = 'c';
        } else {
          prevPtr = origPrevPtr;
          p = origPtr;
        }
    
    
        return retVal;
      };
    
    
     static auto isCurrency = [](char *&prevPtr, char *&p)->bool
      {
        // Modified by Kewei, added several new currency units
        static const string currencies[] = {  // make sure the longer version is first
          "dollars", "dollar", "cents", "cent",
          "euros", "euro", "yen", "yuan", "pounds", "pound", "pence",
          "usd", "eur", "aud", "cad", "cny",
        };
    
    
        for (const string &currency : currencies) {
          const string::size_type lenCurrency = currency.length(); 
          if (strncmp(p, currency.c_str(), lenCurrency) == 0) {
            if (*prevPtr == TheSpace) {
              char *const pEndOfCurrency = p + lenCurrency;
              if (*pEndOfCurrency == TheSpace) {
                advance(prevPtr, p, lenCurrency);
                return true;
              }
            }
          }
        }
    
    
        return false;
      };
    
    
    
    
    static auto isNumber = [](char *&prevPtr, char *&p)->bool
      {
        bool retVal = false;
    
    
        if (*p == '-' || *p == '+') {
          advance(prevPtr, p, 1);
          if (isDigit(prevPtr, p)) {
            retVal = true;
            for (;;) {
              while (isDigit(prevPtr, p)) {}
              if (*p == ',') {
                advance(prevPtr, p, 1);
                continue;
              }
              break;
            }
            if (*p == '.') {
              advance(prevPtr, p, 1);
              while (isDigit(prevPtr, p)) {}
              if (*p == 'e') {
                advance(prevPtr, p, 1);
                if (*p == '-' || *p == '+') {
                  advance(prevPtr, p, 1);
                }
                while (isDigit(prevPtr, p)) {}
              }
            } else if (*p == 'e') {
              advance(prevPtr, p, 1);
              if (*p == '-' || *p == '+') {
                advance(prevPtr, p, 1);
              }
              while (isDigit(prevPtr, p)) {}
            } else if (*p == '/') {		
              advance(prevPtr, p, 1);
              for (;;) {
                while (isDigit(prevPtr, p)) {}
                if (*p == ',') {
                  advance(prevPtr, p, 1);
                  continue;
                }
                break;
              }
            }
          }
        } else if (isDigit(prevPtr, p)) {
          retVal = true;
          for (;;) {
            while (isDigit(prevPtr, p)) {}
            if (*p == ',') {
              advance(prevPtr, p, 1);
              continue;
            }
            break;
          }
          if (*p == '.') {
            advance(prevPtr, p, 1);
            while (isDigit(prevPtr, p)) {}
            if (*p == 'e') {
              advance(prevPtr, p, 1);
              if (*p == '-' || *p == '+') {
                advance(prevPtr, p, 1);
              }
              while (isDigit(prevPtr, p)) {}
            }
          } else if (*p == 'e') {
            advance(prevPtr, p, 1);
            if (*p == '-' || *p == '+') {
              advance(prevPtr, p, 1);
            }
            while (isDigit(prevPtr, p)) {}
          } else if (*p == '/') {		
            advance(prevPtr, p, 1);
            for (;;) {
              while (isDigit(prevPtr, p)) {}
              if (*p == ',') {
                advance(prevPtr, p, 1);
                continue;
              }
              break;
            }
          }
        }
    
    
        return retVal;
      };
    
    
    
    
      static auto advance = [](char *&prevPtr, char *&p, const size_t offset)->void
      {
        if (offset == 0) return;  // safety measure
        prevPtr = p + (offset - 1);
        p = prevPtr + 1;
    	for (prevPtr = const_cast<char *>(text.c_str()), p = const_cast<char *>(text.c_str() + 1);
        *p != '\0';
        advance(prevPtr, p, 1)) {
          if ((flags & TagPercent) == TagPercent) {
            if (checkForPercent(prevPtr, p)) continue;
          }
      }
    
    
      };
    
    
      static auto isDigit = [](char *&prevPtr, char *&p)->bool
      {
        if (*p >= '0' && *p <= '9') {  
          advance(prevPtr, p, 1);
          return true;
        }
        return false;
      };
    
    
    };
    
    
    int main()
    {
    	sample smpl;
        smpl.checkForCurrency = [](char *&prevPtr, char *&p)->bool;
    	smpl.isCurrency = [](char *&prevPtr, char *&p)->bool;
    	smpl.isNumber = [](char *&prevPtr, char *&p)->bool;
    	smpl.advance = [](char *&prevPtr, char *&p, const size_t offset)->void;
        smpl. isDigit = [](char *&prevPtr, char *&p)->bool;
    	cin.ignore();
    
    
    	system("pause");
    	return 0;
    }

  2. #2
    Registered User
    Join Date
    Mar 2010
    Posts
    583
    This is one of those threads where there's nothing to reply to. I'm kinda hoping someone will though, so they can explain to me what on earth this code is doing, and why someone would want to do this. I know very little about C++11 (that'll change!) -- I thought I know what the deal was with lambda functions. But a class full of them -- I've no idea what this is all about. I did try to RTFM but I couldn't find anything else like this.

  3. #3
    and the Hat of Guessing tabstop's Avatar
    Join Date
    Nov 2007
    Posts
    14,336
    I think those are less lambda functions and more syntax errors. (You can't give a lambda a name in the declaration so far as I can tell.) Basically take out the brackets, and you have just plain old functions with the new fancy auto ->returntype style.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. errors with display function!! Help Plz!!
    By irishfeeney92 in forum C Programming
    Replies: 15
    Last Post: 05-02-2011, 06:51 PM
  2. How to display output using puchar() only ???
    By spurs01 in forum C Programming
    Replies: 11
    Last Post: 11-13-2009, 03:53 AM
  3. output file display -- Need Help
    By boostpower in forum C Programming
    Replies: 2
    Last Post: 04-06-2006, 01:50 PM
  4. Please help clear two errors
    By hunter_04 in forum C++ Programming
    Replies: 8
    Last Post: 09-21-2004, 08:36 AM
  5. position output on clear screen
    By ghettoman in forum C++ Programming
    Replies: 1
    Last Post: 11-02-2001, 01:34 AM

Tags for this Thread