Closed. This question is
off-topic。它当前不接受答案。
想改善这个问题吗?
Update the question,所以它是
on-topic,用于堆栈溢出。
3年前关闭。
我已经用C编写了一个程序,以查找另一个模式中是否存在某个模式。两种模式都是二维字符数组。
为了进一步说明,请考虑以下情况。
假设模式A为
1234567890
0987654321
1111111111
1111111111
2222222222
模式B是
876543
111111
111111
在这种情况下,模式B存在于模式A内。从第二行和第三列开始。
下面是我的代码。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int t, T, R, C, r, c;
char** arr;
char ** pat;
int i, j, x, y, m = 0, n = 0, count = 0, brk_flag = 0, brk_flag2 = 0, found = 0;
freopen("C:\\test.txt", "r", stdin);
scanf("%d", &T);
for (t = 0; t<T; t++) {
scanf("%d%d", &R, &C);
arr = (char**)malloc(R * sizeof(char*));
if (arr == NULL) {
printf("Unable to allocate memory.");
exit(1);
}
for (i = 0; i < R; i++) {
arr[i] = (char*)malloc(C * sizeof(char));
scanf("%s", arr[i]);
}
scanf("%d%d", &r, &c);
pat = (char**)malloc(r * sizeof(char*));
if (pat == NULL) {
printf("Unable to allocate memory.");
exit(1);
}
for (i = 0; i < r; i++) {
pat[i] = (char*)malloc(c * sizeof(char));
scanf("%s", pat[i]);
}
brk_flag2 = 0;
found = 0;
for (i = 0; i < R; i++) {
for (j = 0; j < C; j++) {
if (arr[i][j] == pat[0][0]) {
if (i + r > R || j + c > C)
continue;
x = 0;
y = 0;
brk_flag = 0;
for (m = i; m< i + r; m++) {
y = 0;
for (n = j; n< j + c; n++) {
if (arr[m][n] == pat[x][y]) {
count++;
}
else {
brk_flag = 1;
break;
}
y++;
}
if (brk_flag == 1)
break;
x++;
}
if (count == (r * c)) {
printf("YES\n");
brk_flag2 = 1;
found = 1;
break;
}
count = 0;
}
else
continue;
}
if (brk_flag2 == 1)
break;
}
if (found == 0) {
printf("NO\n");
}
/*
for (i = 0; i < R; i++) {
free(arr[i]);
}
for (i = 0; i < r; i++) {
free(pat[i]);
}
*/
}
return 0;
}
对于模式A大小为1000 X 1000的测试用例,在Windows上可以正常使用。但是在Linux上,我收到一个错误消息,称为“异常终止”。
我找不到在哪里做错了。任何对此的想法将不胜感激。谢谢。
我怀疑您的问题在这里:
pat[i] = (char*)malloc(c * sizeof(char));
scanf("%s", pat[i]);
这为
c
字符分配了足够的空间,但没有为其他终止空字符分配足够的空间。更改为:
pat[i] = (char*)malloc((c+1) * sizeof(char));
scanf("%s", pat[i]);
这样,
scanf
可以读取
c
字符,但仍有空间可以终止
null
字符。否则,您将越过分配的数组进行写操作,并且将遭受未定义的行为。
当然,
arr[i]
也是如此。
我是一名优秀的程序员,十分优秀!