-2

我编写了以下程序来用 %20 替换空格。它工作正常。但是它会为指针变量 ptr 打印一些垃圾值,尽管它可能被限制为 8 个字符,因为 malloc 为其分配了 8 个字节的内存。

谁能告诉我这里哪里出错了?或者有没有合适的算法?

void replaceSpaces(char *inputStr )
{

    char *ptr;
    int i,length, spaceCount=0;
    int newLength,j;

    for (length=0; *(inputStr+length)!='\0';length++ )
    {
        if (*(inputStr+length)==' ')
        {
            spaceCount++;
        }
    }
    newLength = length + 2*spaceCount;
    ptr = (char *)malloc(newLength*sizeof(char));

    for ( i = length-1; i >=0; i--)
    {
        if (*(inputStr+i)==' ')
        {

            *(ptr+newLength-1)='0';
            *(ptr+ newLength-2)='2';
            *(ptr+newLength-3)='%';
            newLength = newLength -3;
        }
        else
        {
            *(ptr+newLength-1) = *(inputStr+i);     
            newLength = newLength -1;
        }
    }
    for ( i = 0; *(ptr+i)!='\0'; i++)
    {
        printf("%c",*(ptr+i));
    }

 }  
4

3 回答 3

2

用于calloc()分配内存ptr或在分配后终止它'\0'

使用您的代码,ptr永远不会以'\0'.

所以要么改变

ptr = (char *)malloc(newLength*sizeof(char));

ptr = calloc(newLength*sizeof(char), sizeof(char));

或者在分配ptr.

ptr[newLength] = '\0';
于 2013-08-10T06:14:27.000 回答
0

假设这将适用于相当短的字符串,那么两次遍历字符串有点愚蠢。如果像在大多数情况下一样,CPU 比内存更有价值,请执行以下操作:

char *dst = malloc(3*strlen(src) + 1);
char *result = dst;
while (*src) {
    if (*src == ' ') {
       strcpy(dst, "%20"); dst+=3;
    }
    else *dst++ = *src;
    src++;
}
*dst = 0;
// result is result
于 2013-08-10T07:36:14.260 回答
0

如果您不需要转换后的字符串,那么您无需担心转换:您可以直接输出字符。

void replace_spaces(const char *in) {
    for (const char *p=in; *p; p++) {
        if (*p == ' ') {
            puts("%20");
        } else {
            putch(*p);
        }
    }
}

如果您确实需要转换后的字符串,那么这种代码的一个有用模式是进行两次字符串转换;一次是在“试运行”模式下进行转换但不写入结果,一次是在“实时”模式下进行实际写入。在第一遍中,您计算​​所需的长度。这避免了逻辑的重复,并且如果您正确计算了结果长度,它会更加明显。这是该风格的一些代码,带有一些测试用例。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *replace_spaces(const char *in) {
    char *result = 0;
    for (int write = 0; write <= 1; write++) {
        int n = 0;
        for (const char *from = in; ;from++) {
            if (*from == ' ') {
                if (write) memcpy(result + n, "%20", 3);
                n += 3;
            } else {
                if (write) result[n] = *from;
                n++;
            }
            if (!*from) break;
        }
        if (!write) result = malloc(n);
    }
    return result;
}

int main(int argc, char**argv) {
    const char*cases[] = {"Hello world", "abc", " sp sp sp "};
    for (int i = 0; i < sizeof(cases) / sizeof(cases[0]); i++) {
        char *rep = replace_spaces(cases[i]);
        printf("'%s' -> '%s'\n", cases[i], rep);
        free(rep);
    }
    return 0;
}
于 2013-08-10T07:22:57.893 回答