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