我试图通过创建一个大于实际字符串并在适当位置进行替换的字符数组来删除字符串的空格。但是,似乎没有正确复制值。
我认为你可以做char a[7]="aaaa ";
以便你有更多的记忆来做替换,但我想我错了。问题是在运行代码并打印a
后,我仍然得到相同的字符串aaaa
注意:请注意,我正在尝试从字符串的末尾开始写入,因此覆盖不是一个问题。
注意:测试空间的预期输出'将是'测试%20space'
int countSpace(char *str) {
int nSpaces = 0;
while (*(str) != '\0') {
if (*(str) == ' ') {
nSpaces++;
}
str++;
}
return nSpaces;
}
int main()
{
char a[7]="aaaa ";
int alength = strlen(a);
int newSize = alength + countSpace(a)*2;
a[newSize] = '\0';
newSize--;
for (int i = alength - 1; i >= 0; i--) {
if (a[i] == ' ') {
a[newSize] = '0';
a[newSize - 1] = '2';
a[newSize - 2] = '%';
newSize -= 3;
} else {
a[newSize] = a[i];
newSize--;
}
}
printf("%s", a);
}
答案 0 :(得分:2)
我认为没有任何令人满意的方法来执行此操作。我看到你从最后开始尝试做一些聪明的事情;不幸的是,这并没有真正的帮助。
让我们暂时考虑一个小测试用例:字符串"abc def"
。无论你是从头还是头开始,当你半途而废时,你都会遇到那个空间,而你需要用三个字符替换它({{ 1}})。为了实现这一点,你必须使超出该空间的三个角色全部超过两个角色以腾出空间,这令人烦恼且难以做到。 (当你从最后开始时,它实际上更加困难,因为你需要让字符串的开头向后移动,这需要你在开始之前有空间可用如果你要前进,你至少可以将字符串的末尾移动到你已经分配到最后的空间。)
除非出于某种原因您绝对需要执行此操作,否则我强烈建议您使用两个缓冲区。这样会更容易。
答案 1 :(得分:1)
您可以使用memmove:
您需要分配足够长的内存以支持额外的2个空格字符。在以下代码段中,data2
足以保留data
中替换的空格。
// prepare memory long enough to hold %20 spaces
char data[] = "The quick brown fox jumps over the lazy dog";
int newSize = strlen(data) + countSpace(data)*2;
char data2[newSize+1];
strcpy(data2,data);
现在让我们替换data2
:
// replace the spaces in data2
for(char*s=strchr(data2,' '); s!=NULL; s=strchr(s+1,' ')) {
memmove(s+2,s,newSize+data2-s); // shift the rest of the string by 2
memcpy(s,"%20",3); // replace ' ' for '%20'
}
data2[newSize] = 0; // end of string
现在data2
包含
在%20quick%20brown%20fox%20jumps%20over%第二十条%20lazy%20dog
答案 2 :(得分:0)
你错了:
for (int i = alength - 1; i >= 0; i--) {
if (a[i] == ' ') {
a[newSize] = '0';
a[newSize-1] = '2';
a[newSize-2] = '%';
newSize -= 3;
} else {
a[newSize] = a[i];
newSize--;
}
}