【发布时间】:2016-12-10 13:18:32
【问题描述】:
我尝试使用此代码通过分隔符将一个字符串分成两个字符串
int indexOf(char *msg, char c) {
int i;
for (i = 0; msg[i] != '\0'; i++) {
if (msg[i] == c)
return i;
}
return -1;
}
char *substring(char *msg, int startIndex, int endIndex) {
int length = endIndex - startIndex;
char *input = (char *)malloc(length * sizeof(char) + 1);
int i;
for (i = startIndex; i != endIndex; i++) {
input[i - startIndex] = msg[i];
}
input[endIndex] = '\0';
return input;
}
在main 我有:
index = indexOf(msg, ':');
first = substring(line, 0, index - 1);
second = substring(line, index + 2, strlen(line));
当我使用 valgrind 对其进行测试时,此代码会产生正确的输出。在第二个变量中分配的子字符串会产生错误。
这个函数的问题在哪里?有没有其他方法可以将字符串拆分成两个字符串?
char *msg = readMessage(stdin);
index = indexOf(msg, '\n');
char *line, *first, *second;
line = substring(msg, 0, index);
结束 valgrind Address 0x5203a52 is 5 bytes after a block of size 13 alloc'd
编辑:还有另一个错误
index = indexOf(line, ':');
现在 valgrind 错误位于 input[endIndex] = '\0'; 行的子字符串中:
Invalid write of size 1
编辑:我的代码有两个错误的解决方案
主要
index = indexOf(msg, ':');
应该是
index = indexOf(line, ':');
在子字符串中
input[endIndex] = '\0';
应该是
input[length] = '\0';
谢谢大家
【问题讨论】:
-
什么错误?而且,顺便说一句,不要投
malloc返回。 -
你正在投射
malloc,那不应该是strlen(msg)吗?line是从哪里来的? -
可以查看
strtok吗?始终将指针变量初始化为NULL以保持理智。你调试过吗?readMessage的代码是什么?我认为从函数返回的指针变量正在被破坏,因为它是在函数的堆栈中分配的。