【金山笔试】字符串替换

一夜编舟 2013-07-08 12:41:41
假如有一个工程要进行移植,需要将源代码中字符串格式为L“content of string”替换成_X("content of string"),如:
L"hello"->_X("hello");
L”I am \“ you "->_X("I am \“ you ")
假如你是该工作的负责人,你将如何解决该问题?
可以使用任何文本编辑器,任何工具和开发语言,写出关键步骤。如果用开发语言(脚本语言),给出关键代码。

==========
谢谢
...全文
569 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2013-07-11
  • 打赏
  • 举报
回复
引用 26 楼 jk19941122 的回复:
[quote=引用 18 楼 lm_whales 的回复:] 用编辑器吧 如果只有L“content of string”这种字符串 可以这样做 L“content of string”替换成_X("content of string") 第一步 “替换成") 第二步L") 替换成_X("
看8楼的,这样没有考虑” ”的情况[/quote]下一楼(19 楼) 再看看,如果彻底处理,当然用程序,----正则表达式解决了。 如果只有几个简单情况,直接替换很省事的
ForestDB 2013-07-10
  • 打赏
  • 举报
回复
要完整的解决问题,一个简单的词法解析是少不了的,即老赵的“有限状态自动机”。
凌典 2013-07-10
  • 打赏
  • 举报
回复
引用 18 楼 lm_whales 的回复:
用编辑器吧 如果只有L“content of string”这种字符串 可以这样做 L“content of string”替换成_X("content of string") 第一步 “替换成") 第二步L") 替换成_X("
看8楼的,这样没有考虑” ”的情况
lm_whales 2013-07-09
  • 打赏
  • 举报
回复
L”I am \“ you "->_X("I am \“ you " 如果有这种\“)替换回来\“ 如果已经有 \") 把\")替换成\"\) 等文件里,没有出现的符号。
lm_whales 2013-07-09
  • 打赏
  • 举报
回复
用编辑器吧 如果只有L“content of string”这种字符串 可以这样做 L“content of string”替换成_X("content of string") 第一步 “替换成") 第二步L") 替换成_X("
choudoufu007 2013-07-09
  • 打赏
  • 举报
回复
累死了 用word最简单 word属于文本编辑器吧
赵4老师 2013-07-09
  • 打赏
  • 举报
回复
引用 15 楼 qzf362269994 的回复:
引用 10 楼 linsen_519 的回复:
sed -i 's/L\("hello"\)/_X(\1)/g' filename
提醒:解决字符串扫描处理问题,“正则表达式”不是万能的,“有限状态自动机”是万能的。
Darkingp 2013-07-09
  • 打赏
  • 举报
回复
用正则 把这个分成两部分 L 一部分 "xx" 内容一部分,然后用_T()把内容包括进来
www_adintr_com 2013-07-09
  • 打赏
  • 举报
回复
字符串会换行么? 比如出现这种:

	wchar_t* s = L"He	\
		llo";
赵4老师 2013-07-09
  • 打赏
  • 举报
回复
L"\"\\\"\\"
愤怒的豆沙包 2013-07-09
  • 打赏
  • 举报
回复
:%s/L"\(\([^"^\\]*\|\\.\)*\)"/_X(\1) vim 正则
ken_scott 2013-07-09
  • 打赏
  • 举报
回复

#include <iostream>
#include <fstream>

void convert(std::ifstream & ifs, std::ofstream & ofs)
{
    const int MAX_BUFF_SIZE = 4096;
    char buffer[MAX_BUFF_SIZE];
    bool in_string = false;  // 当前处理字符是否被一对""包含
    bool has_l_mark = false; // 当前处理字符是否被一对""包含, 而且是L""
    char last_char = '\0';   // 记录上一个处理的字符

    while (!ifs.eof())
    {
        ifs.getline(buffer, MAX_BUFF_SIZE);
        for (int i = 0; i < ifs.gcount(); ++i)
        {
            char current_char = buffer[i];
            if ('\0' == current_char)
            {
                current_char = '\n';
            }

            if (in_string)
            {
                ofs << current_char;
                if ('\"' == current_char && '\\' != last_char)
                {
                    if (has_l_mark)
                    {
                        ofs << ')';
                    }
                    in_string = false;
                    has_l_mark = false;
                }
            }
            else
            {
                if ('\"' == current_char)
                {
                    if ('\\' != last_char)
                    {
                        in_string = true;
                    }

                    if ('L' == last_char)
                    {
                        long pos = ofs.tellp();
                        ofs.seekp(pos - 1);
                        ofs << "_X(";
                        has_l_mark = true;
                    }
                }
                ofs << current_char;
            }
            last_char = current_char;
        }
    }
}

int main(int argc, char * argv[])
{
    std::ifstream ifs("L.cpp", std::ios::in);
    if (!ifs.is_open())
    {
        return(1);
    }

    std::ofstream ofs("X.cpp", std::ios::out | std::ios::trunc);
    if (!ofs.is_open())
    {
        return(2);
    }

    convert(ifs, ofs);

    ifs.close();
    ofs.close();

    return(0);
}
测试文件: L.cpp

#include <iostream>

int main(int argc, char * argv[])
{
    const wchar_t * const p1 = L"abc";
    const wchar_t * const p2 =L"abc";
    const char * const p3 = "abc";
    const wchar_t * const p4 = L"L";
    const wchar_t * const p5 = L"abc\"Labc";
    const wchar_t * const p6 = L"abc\"L\"abc";
    const wchar_t * const p7 = L"abc\" L\"abc";
    const char * const p8 = "abc\"Labc";
    const char * const p9 = "abc\"L\"abc";
    const char * const p10 = "abc\" L\"abc";
    const char * const p11 = ("abcL", "");

    return(0);
}
结果文件: X.cpp

#include <iostream>

int main(int argc, char * argv[])
{
    const wchar_t * const p1 = _X("abc");
    const wchar_t * const p2 =_X("abc");
    const char * const p3 = "abc";
    const wchar_t * const p4 = _X("L");
    const wchar_t * const p5 = _X("abc\"Labc");
    const wchar_t * const p6 = _X("abc\"L\"abc");
    const wchar_t * const p7 = _X("abc\" L\"abc");
    const char * const p8 = "abc\"Labc";
    const char * const p9 = "abc\"L\"abc";
    const char * const p10 = "abc\" L\"abc";
    const char * const p11 = ("abcL", "");

    return(0);
}
当前代码不足: 处理不了如下情形: const wchar_t * p12 = L"abc" L"abc"; const wchar_t * p13 = L"abc" "abc"; const wchar_t * p14 = L"abc" "abc" "abc"; const wchar_t * p14 = L"abc" "abc" L"abc"; 。。。。 诸如此类的情形
橡木疙瘩 2013-07-08
  • 打赏
  • 举报
回复
测试数据写错了一个,第五个是: "abcL", "def"不变
橡木疙瘩 2013-07-08
  • 打赏
  • 举报
回复
这个问题没有那么简单,需要正确识别出C字符串的起始和终结 用宏定义不能解决 简单地把L"替换成_X("也不行,一是少了尾括号,二是没有识别L是否是在字符串内。 L"abcde"变为_X("abcde") L"abc\"de"变为_X("abc\"de")而不是_X("abc\")de" "abcdL"不变 "abcL""def"不变 abcL", "def不变 L"abc" "def" 变为 _X("abc" "def") L"abc\ def" 变为 _X("abc\ def")
nice_cxf 2013-07-08
  • 打赏
  • 举报
回复
看起来简单,实际还要知道L后边的双引号是开始还是结束,不然类似"TALL"也被替换了,可能还要考虑L之前必须是空格,tab回车等,虽然不是特别麻烦,但也不是上边所想的那么简单
enic 2013-07-08
  • 打赏
  • 举报
回复
你就不应该去面试。。。
BeanJoy 2013-07-08
  • 打赏
  • 举报
回复

Editplus,我喜欢用这个。

如果你开发过UNICODE程序,应该知道_T这个宏,参数一下这个宏的定义。
healer_kx 2013-07-08
  • 打赏
  • 举报
回复
你就不应该去面试。。。
Inhibitory 2013-07-08
  • 打赏
  • 举报
回复
使用正则表达式进行字符串替换 递归的搜索源文件
Lyinsc 2013-07-08
  • 打赏
  • 举报
回复
#ifdef xxxxxxx #define _X L #endif
加载更多回复(7)

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧