c ++中的疑难解答替换字符串程序 [英] troubleshooting in c++ Replace the string program
本文介绍了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屋!
查看全文