在c程序中用%20替换空格

时间:2013-08-10 06:00:38

标签: c algorithm

我编写了以下程序来替换%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));
    }

 }  

3 个答案:

答案 0 :(得分:2)

使用calloc()ptr分配内存,或在分配后使用'\0'终止内存。

使用您的代码,ptr永远不会被'\0'终止。

所以要么改变

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

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

或者在分配ptr后添加以下行。

ptr[newLength] = '\0';

答案 1 :(得分: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;
}

答案 2 :(得分: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