0

我的输入字符串是

\\?\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();
}
4

3 回答 3

2

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

于 2012-07-06T07:08:23.910 回答
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];
    } 
}
于 2012-07-06T10:37:31.033 回答
0

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

例如

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

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

于 2012-07-06T07:28:07.113 回答