- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
void operation2(char **p, int n, char *sir) {
int i, move, k, xlen, ylen;
char *x, *y, *q, separatori[] = " \'\",!?";
x = strtok(sir, " ");
y = strtok(NULL, " ");
xlen = strlen(x);
ylen = strlen(y);
move = ylen - xlen;
for (i = 0; i < n; i++) {
k = 0;
while (strstr(p[i] + k, x)) {
q = strstr(p[i] + k, x);
if ((strchr(separatori, *(q - 1)) || q == p[i]) &&
(*(q + xlen) == '\0' || strchr(separatori, *(q + xlen)))) {
if (move > 0 && k == 0)
p[i] = realloc(p[i], (strlen(p[i]) + move * counter(p[i], x) + 1) * sizeof(char));
q = strstr(p[i] + k, x);
memmove(q + xlen + move, q + xlen, strlen(q + xlen) + 1);
memcpy(q, y, ylen);
k = strlen(p[i]) - strlen(q) + ylen;
if (move < 0)
p[i] = realloc(p[i], (strlen(p[i]) + move + 1) * sizeof(char));
} else
k = k + xlen;
}
puts(p[i]);
}
}
该代码旨在在 x
中动态分配的文本中查找一个词 ( y
) 并将其替换为第二个词 ( **p
) .它们以字符串形式出现 ( sir
) 并且是分开的。 move
存储获得的单词之间的差异。 n
表示文本中的行数。
单词x
不能在另一个词中,因此需要检查分隔符。
如果满足条件,则根据 move
是否重新分配字符串。是正面的还是负面的。如果它是正数,字符串会更长并且可以重新分配给单词 x
的所有出现。在里面。 counter
是一个计算字符串中出现次数的函数。当move
为负数,则必须减少字符串,以便在操作发生后重新分配。
替换是用 memmove
完成的和 memcpy
.
k
是x
出现后的位置.
在测试期间需要替换 "o"
与 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
.
这是引用 Reference
这就是我得到的 Result
替换"o"
时在字符串的中间发生错误,指向下一行的指针丢失,指向上一行的结尾部分。 1 表示后续行的计数器值
Does
realloc
use memory that was already allocated and by doing so the next pointer is lost?
编辑:这是数组的分配:
int n, i;
scanf("%d", &n);
char **p, *aux;
p = malloc(n * sizeof(char *));
aux = malloc(12000 * sizeof(char));
getchar();
for (i = 0; i < n; i++) {
fgets(aux, 12000, stdin);
p[i] = malloc((strlen(aux) + 1) * sizeof(char));
strcpy(p[i], aux);
p[i][strlen(p[i]) - 1] = '\0';
}
free(aux);
最佳答案
您的代码非常困惑,因为副作用太多,对 strlen
的冗余调用...
主要问题是您没有为字符串分配足够的空间:您忘记了 '\0'
终止符所需的额外字节。
您在解析文件时在主例程中犯了这个错误。
当你realloc
吃掉这条线时,你又做了一次。
当您memmove
该行的内容时,您也忘记了包含空字节。
首先解决这些问题。可能还有其他的,但您需要简化代码才能看到它们。阅读所有评论,有很多提示。
编辑:您已将代码固定到位,这可能会使这个问题的其他读者感到困惑,但您在第二次调用 realloc
时仍然有错误:
p[i] = realloc(p[i], (strlen(p[i]) + move + 1) * sizeof(char));
不正确,因为您已经缩短了该行,因此 strlen(p[i])
是新的长度。简单地写:
p[i] = realloc(p[i], strlen(p[i]) + 1);
编辑:这是 operation2
的简单版本,修复了评论中的大多数评论。我没有使用 count
,因为您没有发布代码,所以我不能断言这样做是正确的。
void operation2(char **p, int n, char *sir) {
int i, move, k, xlen, ylen;
static const char separatori[] = " \'\",!?";
char *x, *y, *q;
x = strtok(sir, " ");
y = strtok(NULL, " ");
xlen = strlen(x);
ylen = strlen(y);
move = ylen - xlen;
for (i = 0; i < n; i++) {
k = 0;
while ((q = strstr(p[i] + k, x)) != NULL) {
k = q - p[i];
if ((q == p[i] || strchr(separatori, q[-1])) &&
(q[xlen] == '\0' || strchr(separatori, q[xlen]))) {
if (move > 0) {
p[i] = realloc(p[i], strlen(p[i]) + move + 1);
q = p[i] + k;
}
memmove(q + ylen, q + xlen, strlen(q + xlen) + 1);
memcpy(q, y, ylen);
k += ylen;
if (move < 0) {
p[i] = realloc(p[i], strlen(p[i]) + 1);
}
} else {
k += xlen;
}
}
puts(p[i]);
}
}
关于c - 使用 realloc 后,数组中的下一个指针丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34144986/
我正在尝试创建一个包含 int[][] 项的数组 即 int version0Indexes[][4] = { {1,2,3,4}, {5,6,7,8} }; int version1Indexes[
我有一个整数数组: private int array[]; 如果我还有一个名为 add 的方法,那么以下有什么区别: public void add(int value) { array[va
当您尝试在 JavaScript 中将一个数组添加到另一个数组时,它会将其转换为一个字符串。通常,当以另一种语言执行此操作时,列表会合并。 JavaScript [1, 2] + [3, 4] = "
根据我正在阅读的教程,如果您想创建一个包含 5 列和 3 行的表格来表示这样的数据... 45 4 34 99 56 3 23 99 43 2 1 1 0 43 67 ...它说你可以使用下
我通常使用 python 编写脚本/程序,但最近开始使用 JavaScript 进行编程,并且在使用数组时遇到了一些问题。 在 python 中,当我创建一个数组并使用 for x in y 时,我得
我有一个这样的数组: temp = [ 'data1', ['data1_a','data1_b'], ['data2_a','data2_b','data2_c'] ]; // 我想使用 toStr
rent_property (table name) id fullName propertyName 1 A House Name1 2 B
这个问题在这里已经有了答案: 关闭13年前。 Possible Duplicate: In C arrays why is this true? a[5] == 5[a] array[index] 和
使用 Excel 2013。经过多年的寻找和适应,我的第一篇文章。 我正在尝试将当前 App 用户(即“John Smith”)与他的电子邮件地址“jsmith@work.com”进行匹配。 使用两个
当仅在一个边距上操作时,apply 似乎不会重新组装 3D 数组。考虑: arr 1),但对我来说仍然很奇怪,如果一个函数返回一个具有尺寸的对象,那么它们基本上会被忽略。 最佳答案 这是一个不太理
我有一个包含 GPS 坐标的 MySQL 数据库。这是我检索坐标的部分 PHP 代码; $sql = "SELECT lat, lon FROM gps_data"; $stmt=$db->query
我需要找到一种方法来执行这个操作,我有一个形状数组 [批量大小, 150, 1] 代表 batch_size 整数序列,每个序列有 150 个元素长,但在每个序列中都有很多添加的零,以使所有序列具有相
我必须通过 url 中的 json 获取文本。 层次结构如下: 对象>数组>对象>数组>对象。 我想用这段代码获取文本。但是我收到错误 :org.json.JSONException: No valu
enter code here- (void)viewDidLoad { NSMutableArray *imageViewArray= [[NSMutableArray alloc] init];
知道如何对二维字符串数组执行修剪操作,例如使用 Java 流 API 进行 3x3 并将其收集回相同维度的 3x3 数组? 重点是避免使用显式的 for 循环。 当前的解决方案只是简单地执行一个 fo
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我有来自 ASP.NET Web 服务的以下 XML 输出: 1710 1711 1712 1713
如果我有一个对象todo作为您状态的一部分,并且该对象包含数组列表,则列表内部有对象,在这些对象内部还有另一个数组listItems。如何更新数组 listItems 中 id 为“poi098”的对
我想将最大长度为 8 的 bool 数组打包成一个字节,通过网络发送它,然后将其解压回 bool 数组。已经在这里尝试了一些解决方案,但没有用。我正在使用单声道。 我制作了 BitArray,然后尝试
我们的数据库中有这个字段指示一周中的每一天的真/假标志,如下所示:'1111110' 我需要将此值转换为 boolean 数组。 为此,我编写了以下代码: char[] freqs = weekday
我是一名优秀的程序员,十分优秀!