Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 允许用户通过在C+;中加倍分隔符来传递分隔符+;_C++_String_Escaping_Separator - Fatal编程技术网

C++ 允许用户通过在C+;中加倍分隔符来传递分隔符+;

C++ 允许用户通过在C+;中加倍分隔符来传递分隔符+;,c++,string,escaping,separator,C++,String,Escaping,Separator,我有一个C++函数,它接受以下格式的字符串: <WORD>: [VALUE]; <ANOTHER WORD>: [VALUE]; ... 如果我像这样使用,上述函数将正确输出MANGO: ExtractSubStringFromString(L"[VALUE: MANGO; DATA: NOTHING]", L"VALUE") 然而,若我在下面的字符串中有两个转义分隔符,我会尝试像;一样加倍,但我还是得到了芒果;芒果: ExtractSubStringFromStri

我有一个C++函数,它接受以下格式的字符串:

<WORD>: [VALUE]; <ANOTHER WORD>: [VALUE]; ...
如果我像这样使用,上述函数将正确输出
MANGO

ExtractSubStringFromString(L"[VALUE: MANGO; DATA: NOTHING]", L"VALUE")
然而,若我在下面的字符串中有两个转义分隔符,我会尝试像
;一样加倍,但我还是得到了
芒果
;芒果

ExtractSubStringFromString(L"[VALUE: ;;MANGO;;; DATA: NOTHING]", L"VALUE")
这里,值赋值器是冒号,分隔符是分号。我想允许用户通过将额外的冒号和分号加倍来向我的函数传递冒号和分号。就像我们在许多脚本语言和编程语言中逃避双引号、单引号和许多其他引号一样,在许多程序命令中也逃避参数

我想了很久,但想不出办法。有人能帮我解决这个问题吗


提前感谢。

您应该在字符串中搜索
并将其替换为临时填充符
char
string
,以后可以引用该填充符并将其替换为值

所以基本上:

1)搜索字符串并替换
的所有实例
\tempFill

一起使用-最好选择一个不太可能出现在原始字符串中的字符组合。
2)解析字符串
3)
\tempFill
的所有实例替换为

注意:明智的做法是在字符串上运行断言,以确保
\tempFill
(或您选择的任何填充项)不在原始字符串中,以防止出现错误/错误/错误。您可以使用诸如
\n
之类的字符,并确保原始字符串中没有非字符

免责声明:
我几乎可以保证有更干净、更高效的方法可以做到这一点,但这是最简单的方法。

首先,由于子字符串不需要拆分,我假设它不需要预处理以过滤转义的分隔符

然后在主字符串上,IMHO最简单的方法是在字符串中搜索转义分隔符时过滤它们。伪代码(假设已删除封闭的
[]
):


现在将其转换为C++应该很容易了

将额外的字符加倍——如果字符被认为是文字字符而不是分隔符,为什么不遵循像这样的事实约定,在字符前面加“\”呢?在我看来,将这样的项加倍会使工作更加困难——当你看到“\”时,你知道下一个字符被认为是没有特殊意义的文字字符。我建议你查找json——为什么要重新发明轮子?@AlexG那么如果字符串包含
;;怎么办?@AlexG谢谢!你的解决方案很有效!你应该把它贴出来作为我接受的答案。:-)看起来它可能是许多程序的逃逸机制@SergeBallesta我添加了一个注释来运行断言,但我将添加另一个警告。谢谢你的提醒。我删除了我的评论,因为它们开始成为对话:)。
ExtractSubStringFromString(L"[VALUE: ;;MANGO;;; DATA: NOTHING]", L"VALUE")
last_index = begin_of_string
index_of_current_substring = begin_of_string
loop: search a separator starting at last index - if not found exit loop
    ok: found one at ix
    if char at ix+1 is a separator (meaning with have an escaped separator
       remove character at ix from string by copying all characters after it one step to the left
       last_index = ix+1
       continue loop
    else this is a true separator
        search a column in [ index_of_current_substring, ix [
        if not found: error incorrect string
        say found at c
        compare key_string with string[index_of_current_substring, c [
        if equal - ok we found the key
            value is string[ c+2 (skip a space after the colum), ix [
            return value - search is finished
        else - it is not our key, just continue searching
            index_of_current_substring = ix+1
            last_index = index_of_current_substring
            continue loop