我正在尝试在字符串中的两个字符之间添加空格的程序,我的程序适用于第一个测试用例,但是会触发下一个的例外,请帮助我
#include<stdio.h>
#include<conio.h>
#include "stdlib.h"
#include "ctype.h"
#include "string.h"
struct test {
char input[20];
char output[20];
} testDB[12] = { { "A B C", "A B C" },
{ " abc ", "a b c" },
{ "A b C", "A b C" },
{ "123", "1 2 3" },
{ "", "" },
{ " a1B2c", "a 1 B 2 c" },
{ "a b c", "a b c" },
{ "!@#$", "! @ # $" },
{ "A!@b", "A ! @ b" },
{ " ", "" },
};
void remove_space(char *inp)
{
int i = 0, ch, j = 0, k = 0;
while (inp[i])
{
ch = inp[i];
if (ch == ' ')
{
j = i + 1;
while (inp[j] == (' '))
{
j++;
}
inp[k] = inp[j];
k++;
i = j + 1;
}
else
{
inp[k] = inp[i];
k++;
i++;
}
}
inp[k] = '\0';
return;
}
void add_space(char *inp)
{
int i = 0, j;
while (inp[i])
{
i++;
}
inp = (char *)realloc(inp,sizeof(char)*(i));
j = 2 *( i - 1);
inp[j + 1] = '\0';
while (i>0 && j>0)
{
i--;
inp[j] = inp[i];
j--;
inp[j] = ' ';
j--;
}
return;
}
void testCases()
{
int i;
char * inp[10];
for (i = 0; i < 10; i++)
{
inp[i] = (char *)malloc(sizeof(char)*(strlen(testDB[i].input)+1));
strcpy(inp[i], testDB[i].input);
remove_space(inp[i]);
add_space(inp[i]);
if (strcmp(inp[i], testDB[i].output) == 0)
printf("PASSED\n");
else
printf("FAILED\n");
}
return;
}
int main()
{
testCases();
getch();
return 0;
}
答案 0 :(得分:1)
最关键的问题(如指出n.m
和Michael Walz
)正在重新调整inp的大小:
inp = (char *)realloc(inp,sizeof(char)*(i));
首先,当i
为零时,零作为新大小传递给realloc()
。 realloc(inp, 0);
的记录行为等同于free(inp);
。这意味着对inp指向的(现在释放的)内存的任何额外访问都可能导致问题;包括分段错误等。如下行:
inp[j + 1] = '\0';
如果inp == NULL
。
以下是realloc()
行的替代品:
{
...
char *tmp;
size_t inpLen=strlen(*inp);
tmp = realloc(*inp, (inpLen * 2) + 1);
if(NULL == tmp)
/* handle the error. */
inp=tmp;
...
}
查看我的完整版问题代码here。