我遇到过这个面试问题,希望在尝试理解其解决方案方面有所帮助:
编写一个方法,用'%20'替换字符串中的所有空格。
解决方案(来自论坛):
char str[]="helo b";
int length = strlen(str);
int spaceCount = 0, newLength, i = 0;
for (i = 0; i < length; i++) {
if (str[i] == ' ') {
spaceCount++; //count spaces...
}
}
newLength = length + spaceCount * 2; //need space for 2 more characters..
str[newLength] = '\0';
for (i = length - 1; i >= 0; i--) {
if(str[i] == ' ') {
str[newLength - 1] = '0'; //???
str[newLength - 2] = '2';
str[newLength - 3] = '%';
newLength = newLength - 3;
} else {
str[newLength - 1] = str[i];
newLength = newLength - 1;
}
}
这个程序对我不起作用......我首先想在深入研究代码之前先了解算法。
答案 0 :(得分:12)
该样本已被破坏。
缓冲区溢出,字符串的一次无意义扫描(strlen),难以阅读。
int main() {
char src[] = "helo b";
int len = 0, spaces = 0;
/* Scan through src counting spaces and length at the same time */
while (src[len]) {
if (src[len] == ' ')
++spaces;
++len;
}
/* Figure out how much space the new string needs (including 0-term) and allocate it */
int newLen = len + spaces*2 + 1;
char * dst = malloc(newLen);
/* Scan through src and either copy chars or insert %20 in dst */
int srcIndex=0,dstIndex=0;
while (src[srcIndex]) {
if (src[srcIndex] == ' ') {
dst[dstIndex++]='%';
dst[dstIndex++]='2';
dst[dstIndex++]='0';
++srcIndex;
} else {
dst[dstIndex++] = src[srcIndex++];
}
}
dst[dstIndex] = '\0';
/* Print the result */
printf("New string: '%s'\n", dst);
/* And clean up */
free(dst);
return 0;
}
答案 1 :(得分:3)
for (i = 0; i < length; i++) {
if (str[i] == ' ') {
spaceCount++; //count spaces...
}
}
由于我们用三个字符替换单个字符(''),我们首先计算空格数以计算大小增加。
newLength = length + spaceCount * 2; //need space for 2 more characters..
str[newLength] = '\0';
这不可能这样做,你必须分配更多内存,但这里我们扩展了字符串变量的大小。我认为最好是分配一个新变量,因为下一步将更容易与另一个变量。
for (i = length - 1; i >= 0; i--) {
if(str[i] == ' ') {
str[newLength - 1] = '0'; //???
str[newLength - 2] = '2';
str[newLength - 3] = '%';
newLength = newLength - 3;
} else {
str[newLength - 1] = str[i];
newLength = newLength - 1;
}
}
最后,如果字符串被正确扩展,这个步骤应该有效,但是可以稍微重写一下以使其更清晰。
我建议这样的事情,假设newstr是我们在先前步骤中分配的新变量:
int j = 0;
for(i = 0; i < length; i++, j++) {
if(str[i] == ' ') {
newstr[j] = '%';
newstr[++j] = '2';
newstr[++j] = '0';
} else {
newstr[j] = str[i];
}
}
或者,如果你想保持向后循环(不需要用这个循环分配另一个字符串):
for (i = length - 1, j = newLength - 1; i >= 0; i--, j--) {
if(str[i] == ' ') {
str[j] = '0';
str[--j] = '2';
str[--j] = '%';
} else {
str[j] = str[i];
}
}
答案 2 :(得分:2)
算法是这样的: 首先计算空格数量.. 假设字符串是“ae r t”,这意味着2个空格..并且当前长度是6(在c作为索引的情况下为5为0)。 输出字符串应为“ae%20r%20t”.. length = 10(索引= 0时为9) 所以新的长度是6 +'2'* 2所以她来到10 ...
这个长度如何调整.. 然后他从反向遍历并逐个字符地放置......当他遇到空格时,他将%20反向放置,因为他以相反的顺序遍历原始字符串......
答案 3 :(得分:1)
正如我所看到的,它首先搜索字符串以查找所有空格,然后它会尝试延长字符串以适应字符串中每个空格的2个额外字符(20)(但我不认为他会分配然后它再次通过字符串,但这次相反,将每个不是空格的字符放在新字符串的后面,如果遇到空格,则将%20放在那里,但是反过来。
答案 4 :(得分:1)
/* program to replace the space with "%20" */
/* Author senthilkumar M */
eg str = "ab cd ef"
str1 = "ab%20cd%20ef"
char *space_replace(char *str)
{
int l = strlen(str);
int i = 0, j =0;
int spc = 0, nl = 0;
char *str1 = NULL;
for(i = 0; i < l; i++) {
if(str[i] == ' ') {
spc++;
}
}
nl = l + 2*spc + 1;
str1 = (char *) malloc(sizeof(char) * nl);
if(!str1) {
fprintf(stdout, "malloc failed \n");
return NULL;
}
for(i = 0; i < l; i++) {
if(str[i] == ' ') {
str1[j++] = '%';
str1[j++] = '2';
str1[j++] = '0';
} else {`enter code here`
str1[j++] = str[i];
}
}
str1[j] = '\0';
return str1;
}