c ++中的疑难解答替换字符串程序 [英] troubleshooting in c++ Replace the string program

查看:47
本文介绍了c ++中的疑难解答替换字符串程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

#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 EuroSymbol = ??; //doesn't seem to be an ASCII char
    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 ¤cy : 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 == '/') {		// Modified by Kewei, added a case for fraction
          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 == '/') {		// Modified by Kewei, added a case for fraction
        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;
  };

  static auto isDigit = [](char *&prevPtr, char *&p)->bool
  {
    if (*p >= '0' && *p <= '9') {  // There is a <ctype> function isdigit(), but it converts char to int
      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;
}

推荐答案

' || * p == ' €' || * p == ' £' || * p == ' ¥' || * p == ' ¢'){
advance(prevPtr,p, 1 );
if (isNumber(prevPtr,p)){
retVal = true ;
} 其他 如果(* p == TheSpace){
char * tmpPtr = p;
advance(prevPtr,p, 1 );
if (isNumber(prevPtr,p)){
retVal = true ;
} else {
p = tmpPtr;
}
}
} 其他 如果(isNumber(prevPtr, p)){
if (* p == CentSymbol){
advance(prevPtr,p, 1 );
retVal = true ;
} else if (isCurrency(prevPtr,p)){
retVal = true ;
} 其他 如果(* 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;
}
}
}

如果(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
{
// 由Kewei修改,添加了几个新的货币单位
static const 字符串货币[] = { // 确保较长的版本是第一个
dollar dollar 美分 cent
euros euro 日元 yuan pound pence
usd eur aud cad cny
};

for const string¤cy:currency){
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 ;
};


静态 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 );
继续;
}
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 == ' / '){ // 由Kewei修改,添加了一个小数
的案例advance(prevPtr,p, 1 );
for (;;){
while (isDigit(prevPtr,p) ){}
if (* p == ' ,'){
advance(prevPtr,p, 1 );
继续;
}
break ;
}
}
}
} 其他 如果 (isDigit(prevPtr,p)){
retVal = true ;
for (;;){
while (isDigit(prevPtr,p) ){}
if (* p == ' ,'){
advance(prevPtr,p, 1 );
继续;
}
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 == ' / '){ // 由Kewei修改,添加了一个小数
的案例advance(prevPtr,p, 1 );
for (;;){
while (isDigit(prevPtr,p) ){}
if (* p == ' ,'){
advance(prevPtr,p, 1 );
继续;
}
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;
};

static auto isDigit = [](char *&prevPtr, char *&p)->bool
{
if (*p >= '0' && *p <= '9') { // There is a <ctype> function isdigit(), but it converts char to int
advance(prevPtr, p, 1);
return true;
}
return false;
};

};

int main()
{
\tsample smpl;
\tsmpl.checkForCurrency = [](char *&prevPtr, char *&p)->bool;
\tsmpl.isCurrency = [](char *&prevPtr, char *&p)->bool;
\tsmpl.isNumber = [](char *&prevPtr, char *&p)->bool;
\tsmpl.advance = [](char *&prevPtr, char *&p, const size_t offset)->void;
smpl. isDigit = [](char *&prevPtr, char *&p)->bool;
\tcin.ignore();
system( pause);
return 0 ;
}
' || *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 ¤cy : 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 == '/') { // Modified by Kewei, added a case for fraction 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 == '/') { // Modified by Kewei, added a case for fraction 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; }; static auto isDigit = [](char *&prevPtr, char *&p)->bool { if (*p >= '0' && *p <= '9') { // There is a <ctype> function isdigit(), but it converts char to int 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; }


please help me. clear the errors in this C++ program. rply for my email xxxxxx
please help me. clear the errors in this C++ program. rply for my email xxxxxx


这篇关于c ++中的疑难解答替换字符串程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆