[我一直试图像在报纸上那样,不使用任何库函数就使一个单词困惑:
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;
}
第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)] >>但是这还不够,如果输入无效,
多2的scanf
可以读取多个COLUNM个字符,甚至您输入的12个字符也可以忘记scanf也会写入空字符完成字符串,因此它写入13个字符。一种方法是读入比[[COLUMNstring”,并检查输入字符串的长度。因此,您的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]);
是无效的,因为它将结果放在之后,索引必须为0,实际上您可以只给出string
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中,您在打印
PUZZLEprintf
替换为puts。请注意,当您知道没有[%]时,要求printf搜索%等是没有用的。在findString
第一个问题是,仅当count == computeLength(string)
为true时才返回值,您需要始终返回一个值。通常,如果字符串不在拼图中,则可以返回-1,因此return (count==computeLength(string)) ? i : -1;
但是这也是错误的,有两个原因:
到达测试时始终为180,而不是字符串所在的位置i
这不是因为
是真的,因为您习惯了增加[[count并增加下一个错误:您未正确搜索难题中的字符串,因为在- count == computeLength(string)
i 上的第一个循环通过了字符串(string [i]),最糟糕的情况是当其长度为时将访问其中的180个字符仅49(不带最后一个空字符)。即使找到了字符串,您也不会停止搜索。在您的算法中,您忘记了字符串的字符必须连续放置在矩阵中,每当您(错误地)在矩阵中的任何位置发现字符串的字符时,您递增count。仅考虑您从左到右水平搜索字符串:
string
上的循环必须是嵌入度更高的循环,以检查其字符在矩阵中是否连续。处的字符,这意味着您可以遍历
- 您在行上有一个循环,在列上有一个循环,这是无用的,只会使工作变得一无所有。因为
处的字符是matrix
是一个数组,所以matrix [r] [COLUMN]- matrix [r + 1] [0]
matrix
就像是一个ROW * COLUMN个字符的字符串。 我让您重写findString,它类似于strstr,除了您返回索引或-1而不是子字符串的地址或NULL仅查看提到的编译错误(并且仅查看编译错误),我建议您执行以下操作:
#include <string.h>
...
const char* string = "hello";
int length = strlen(string);
...