我的输入字符串是
\\?\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();
}
答案 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
,因此打印输出行为不正常。