在2D数组中查找子字符串(拼图)

问题描述 投票:0回答:2

[我一直试图像在报纸上那样,不使用任何库函数就使一个单词困惑:

15 rows 12 colums
X T Z M Q Y K C E C F H -->12 chars 
S H O U T E X O E A P I
X G T L Q B E L T N F K
'
'
'

如您在第二行中看到的,是单词SHOUT。现在设计了拼图游戏,以便用户可以逐行输入他们想要的任何类型的字符集。

我想做的是当搜索一个单词(如SHOUT)时,我将返回其起始索引。我想象的索引将从0开始到180结束,因为12 * 15 = 180像这样很清楚:

X T Z M Q Y K C E C F H
0 1 2 3 4 5 6 7 8 9 10 11
S H O U T E X O E A P I
12 13 14 15 16 17 18 19 20 21 22 23
'
'
'
'''''''''''''''''''179

没有图片很难解释,希望您能理解。

现在,棘手的事情是单词可以在各个方向(从上到下,从下到上,从左到右,从右到左)。我已经编写了大部分代码,但始终会出错,并且只能检查单词是否从左到右。

#include <stdio.h>

#define COLUNM 12
#define ROW 15

int computeLength (char str[50]) {
    int i;
    for (i = 0; str[i] != '\0'; ++i) {
    }
    return i;
}

int findString(char matrix[ROW][COLUNM], char string[], int length) {
    int i = 0, j, k = 0, searchlenght = 0;
    length = computeLength(string);

    for (j = 0; j < ROW; j++) {
        if (matrix[j][k] == string[k]) {
            searchlenght++;
        }
    }
    i++;
    if (searchlength == length) {
        return i;
    }
}

int main() {
    int i, j = 0;
    char matrix[ROW][COLUNM];
    char string[50];
    int b = 1;

    for (i = 0; i < ROW; i++) {
        printf("Enter line %d of the puzzle :\n", i + 1);       
        scanf("%s", &matrix[j][i]);
        j++;    
    }

    while (b > 0) {
        printf("Enter the string to be searched in the puzzle:\n");

        scanf("%s", &string[50]);
        if ((string[0] != 'q') || (string[0] != 'Q')) {
            b = 0;
        }
    }
    return 0;
}

我不认为使用python很难实现,但是我对C并不熟悉,所以我不断收到错误和警告。

仅需要工作的部分是findString函数。不要打扰输入,因为我会自己进行测试。

您能帮忙吗?

我也为findString尝试过此操作,但它不返回任何内容

int findString(char matrix[ROW][COLUNM], char string[], int length) {
    int pos_search = 0;
    int pos_text = 0;
    int len_search = computeLength(string);
    int lenmatrix = 180;
    int y_index = 0;

    for (pos_text = 0; pos_text < lenmatrix - len_search; ++pos_text) {

        if (matrix[y_index][pos_search] == string[pos_search]) {
            ++pos_search;
            if (pos_search == len_search) {
                // match
                printf("match from %d to %d\n", pos_text - len_search, pos_text);
                return pos_search;
            }
        } else {
            pos_text -=pos_search;
            pos_search = 0;
        }
        y_index++;
    }
    // no match
    printf("no match\n");
    return -1;
}
c arrays matrix substring puzzle
2个回答
2
投票
您的代码中有很多问题,首先无法编译。

第29行无效,替换

int findString(char matrix[ROW][COLUNM],char string[15],int computeLength(string[15])){
作者

int findString(char matrix[ROW][COLUNM], char string[15])

注意大小15也没用,您可以将

char string []或char * string用作参数string

第39行无效,替换

if(count==computeLength(string[15])){
作者

if(count==computeLength(string)){

现在您可以编译程序,但这还不够。


main中的一些问题。

您交换了该行中的索引

scanf("%s",&matrix[j][i]);
可以替换为

scanf("%s",&matrix[i][0]);

(我使用0而不是

j,因为它更清楚,它不要求我们检查j值0)] >>但是这还不够,如果输入无效,

scanf

可以读取多个COLUNM个字符,甚至您输入的12个字符也可以忘记scanf也会写入空字符完成字符串,因此它写入13个字符。一种方法是读入比[[COLUMN

多2的

string”,并检查输入字符串的长度。因此,您的for可以替换为:for(i = 0 ; i < ROW ; i++) { printf("Enter line %d of the puzzle :\n",i+1); if ((scanf("%49s", string) != 1) || (strlen(string) != COLUMN)) { puts("invalid line"); return -1; } memcpy(&matrix[i][0], string, COLUMN); i++; }

也请注意在末尾
i
而不是

j

while循环中

scanf("%s",&string[50]);

是无效的,因为它将结果放在
string
之后,索引必须为0,实际上您可以只给出

string。和以前一样,如果输入的字符数超过49个,[[scanf

将从string中写出,所以]]

scanf("%49s", string); 如果要允许搜索50个字符的字符串而不计算最终的空字符,则必须将其大小设置为51,并将49替换为50。

退出打印并读取
while
循环没有任何作用,很可能您想在其中调用

findString

并写入返回的值,直到第一个读取字符为q或Q。实例:

for (;;) { puts("Enter the string to be searched in the puzzle:"); if ((scanf("%49s", string) != 1) || (string[0] =='q') || (string[0] == 'Q')) break; printf("position in the puzzle: %d\n", findString(matrix, string)); } main

的结尾,该行的含义不明确:

printf("%d",computeLength("küfür"));

printPuzzle
中,您在打印
PUZZLE
后遗漏了换行符,您可以将

printf

替换为puts。请注意,当您知道没有[%]时,要求printf搜索%等是没有用的。findString
第一个问题是,仅当

count == computeLength(string)

为true时才返回值,您需要始终返回一个值。通常,如果字符串不在拼图中,则可以返回-1,因此return (count==computeLength(string)) ? i : -1;

但是这也是错误的,有两个原因:

到达测试

i

时始终为180,而不是字符串所在的位置
    这不是因为
  • count == computeLength(string)
是真的,因为您习惯了增加[[count并增加下一个错误:
您未正确搜索难题中的字符串,因为在
  • i
  • 上的第一个循环通过了字符串(string [i]),最糟糕的情况是当其长度为时将访问其中的180个字符仅49(不带最后一个空字符)。即使找到了字符串,您也不会停止搜索。在您的算法中,您忘记了字符串的字符必须连续放置在矩阵中,每当您(错误地)在矩阵中的任何位置发现字符串的字符时,您递增count

    仅考虑您从左到右水平搜索字符串:

    string

    上的循环必须是嵌入度更高的循环,以检查其字符在矩阵中是否连续。
    • 您在行上有一个循环,在列上有一个循环,这是无用的,只会使工作变得一无所有。因为

      matrix

      是一个数组,所以matrix [r] [COLUMN]
    • 处的字符是
    • matrix [r + 1] [0]
    处的字符,这意味着您可以遍历

    matrix

    就像是一个ROW * COLUMN个字符的字符串。 我让您重写findString,它类似于strstr,除了您返回索引或-1而不是子字符串的地址或NULL
  • 仅查看提到的编译错误(并且仅查看编译错误),我建议您执行以下操作:


  • 0
    投票
    已经有一个C函数可以计算C字符串长度:

    #include <string.h> ... const char* string = "hello"; int length = strlen(string); ...

    © www.soinside.com 2019 - 2024. All rights reserved.