从字符串复制所选字符

时间:2012-07-06 07:03:56

标签: c++ c

我的输入字符串是

\\?\bac#dos&ven_bb&prod_open-v&rev_5001#1&7f6ac24&0&353020304346333030363338#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}

必需的输出是

bac\dos&ven_bb&prod_open-v&rev_5001\1&7f6ac24&0&353020304346333030363338_0

我写了以下代码但是没有用...需要帮助才能找出问题。 请原谅我的无知:)如果有更好更有效的方法,请告诉我。

输出字符串的规则是

在第二个字符串中我删除所有“\”和“?” 。在哪里看到“#”我用“\”替换它。第二个字符串只有在你看到字符“{”但在其末尾不包含“#”时才会显示。

感谢

int main() 
{
    char s[] = "\\?\bac#dos&ven_bb&prod_open-v&rev_5001#1&7f6ac24&0&353020304346333030363338#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}";
    char s1[] = {0};
    printf("OUtput string is : ");
    for(int i = 0; s[i] != '{'; i++)
    {
        if(s[i] != '\\' && s[i] != '?')
        {
            int j = 0;
            if(s[i] == '#')
            {
                s1[j] = '\\';
                continue;
            }

            s1[j] = s[i];
            j++;
        }

    }

    for(int i = 0; s1[i] != '\0'; i++)
    {
        cout<<s1[i];    
    }

    getch();
}

3 个答案:

答案 0 :(得分:2)

我建议使用std::string::replace()函数。有很多关于此的在线文档。看一下std::string提供的其他一些功能,因为它们也可能有用。如果您使用的是c ++,那么使用std::string通常比修改char数组和索引更可取。

答案 1 :(得分:1)

请注意j的固定范围。在您的版本中,您始终指定为s1[0]

for(int i = 0, j = 0; s[i] != '{'; i++)
{
    if(s[i] != '\\' && s[i] != '?')
    {
        // int j = 0;
        if(s[i] == '#')
        {
            s1[j] = '\\';
        }
        else
        {
            s1[j] = s[i];
        }
        j++;
    } 
}

另一件事是为新字符串分配足够的空间。由于您未指定大小char s1[] = {0};,因此声明了一个大小为1的数组。您需要执行以下操作:

char s1[sizeof(s)] = { 0 }; // the size of the old array, since we don't know how long the new one will be

但是,既然你标记了Q C ++,那就利用动态可调整大小的std::string

std::string s = ".......";
std::string s1;

for(int i = 0; s[i] != '{'; i++)
{
    if(s[i] != '\\' && s[i] != '?')
    {
        if(s[i] == '#')
            s1 += '\\';
        else
            s1 += s[i];
    } 
}

答案 2 :(得分:0)

你的s1缓冲区需要增加,因为它现在没有新字符串的空间。

E.g。

char* s1 = calloc(strlen(s)+1,sizeof(char)); // same size should be enough, free(s1) later

calloc确保\0已终止,在您的代码中忘记添加\0,因此打印输出行为不正常。