我正在制作一个“简单”的打印输出字符串,追加字符串并从字符串中删除部分。 append和new字符串有时起作用,有时则什么也不输出。 当我这样做时:
char * temp = malloc(newSize);
它只是停止输出任何东西。
我已逐节注释掉了所有内容,试图找出问题所在。似乎找不到问题,但Google不断提出“堆损坏”。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char * data;
int length;
} String;
int str_getLength(const char * characters)
{
int index = 0;
while (1)
{
if (characters[index] == '\0') break;
index++;
}
return index;
}
String str_new(const char * characters)
{
String result;
result.length = str_getLength(characters);
result.data = malloc(result.length);
memcpy(result.data, characters, result.length);
return result;
}
void str_append(String * str, const char * characters)
{
int charsLength = str_getLength(characters);
str->data = realloc(str->data, charsLength);
for (int i = 0; i < charsLength; i++) {
str->data[i + str->length] = characters[i];
}
str->length = str->length + charsLength;
}
void str_remove(String * str, int startIndex, int endIndex)
{
if (startIndex < 0 || endIndex > str->length || endIndex < startIndex) {
return;
}
int chunkSize = endIndex - startIndex;
int newSize = str->length - chunkSize;
char * temp = malloc(newSize);
// for (int i = 0; i < str->length; i++)
// {
// if (i < startIndex || i > endIndex) {
// temp[i] = str->data[i];
// }
// }
// free(str->data);
// str->length = newSize;
// str->data = temp;
}
}
int main()
{
String str = str_new("Hello, ");
printf("%s\n", str.data);
str_append(&str, "this is my first C application.");
printf("%s\n", str.data);
str_remove(&str, 0, 3);
printf("%s\n", str.data);
free(str.data);
return 0;
}
我希望它输出修改后的字符串,但不会,有时甚至什么都不输出。 我是一个初学者,很抱歉,如果能快速解决问题。
答案 0 :(得分:3)
重新分配存在两个问题。首先,您没有将realloc
的结果分配给str->data
,因此,如果将内存重新分配到其他位置,则tr->data
之后将指向无效的内存。其次,您无需添加字符串和附加部分的大小,而只是获取要附加的部分的大小。
这里
realloc(str->data, charsLength);
应该是:
str->data = realloc(str->data, charsLength + str->length + 1);
答案 1 :(得分:3)
除了出色的答案。 再有几个问题了。
// for (int i = 0; i < str->length; i++)
// {
// if (i < startIndex || i > endIndex) {
// temp[i] = str->data[i];
// }
// }
您将无限制访问temp
。
您需要为temp
维护单独的索引。
char * temp = malloc(newSize+1);
int k=0;
for (int i = 0; i < str->length; i++)
{
if (i < startIndex || i > endIndex) {
temp[k++] = str->data[i];
}
}
temp[k] = '\0';
free(str->data);
str->length = newSize;
str->data = temp;
和
您不是null
在追加之后终止字符串。
str->data = realloc(str->data, str->length + charsLength +1); //current length + new length + \0
for (int i = 0; i < charsLength; i++) {
str->data[i + str->length] = characters[i];
}
str->data[i + str->length] = '\0'; //null terminate the new string
str->length = str->length + charsLength;