【发布时间】:2020-01-07 10:14:55
【问题描述】:
我在使用 strcat 时遇到了一个问题,但是使用 realloc,strcat 会覆盖目标字符串
char *splitStr(char *line) {
char *str_;
str_ = (char *) malloc(1);
char *ptr = strtok(line,"\n");
int a;
while (ptr != NULL) {
if (ptr[0] != '$') {
printf("oncesi %s\n", str_);
a = strlen(ptr) + strlen(str_) + 1;
str_ = realloc(str_, a);
strcat(str_, ptr);
str_[a] = '\0';
printf("sontasi:%s\n", str_);
}
ptr = strtok(NULL, "\n");
}
printf("splitStr %d\n", strlen(str_));
printf("%s", str_);
return str_;
}
我的输入值为 ;
*4
$3
200
$4
4814
$7
SUCCESS
$4
3204
所以我想通过 strtok 拆分这个输入值; strtok(line,'\n');
并将所有没有开始“$”字符的行连接到新字符。但是,此代码给出以下输出;
line: *4
oncesi
sontasi:*4
oncesi *4
200tasi:*4
200esi *4
4814asi:*4
4814si *4
SUCCESS:*4
SUCCESS*4
3204ESS:*4
splitStr 25
似乎覆盖了源字符串。 你知道为什么会发生这个问题吗?
【问题讨论】:
-
看起来你的文件中有一些
\r -
未定义的行为...
str_在它指向的内存未初始化时使用 -
未定义的行为...
str_[a]='\0';在分配的内存之外写入 -
str_[a] = '\0';不正确,因为它超出了分配的内存。它应该是str_[a-1] = '\0';(但这是不必要的,因为strcat处理它)。当程序流第一次进入ifblock 时,字符串str_应该指向未初始化并调用未定义的行为。它必须像str_[0] = '\0';一样在malloc之后初始化。
标签: c string-concatenation strcat