我一直试图像在报纸上那样迷惑单词,如下所示:
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
void printPuzzle(char matrix[][COLUNM]){
int i,j;
printf("PUZZLE");
for (i=0;i<ROW;i++)
{
for(j=0;j<COLUNM;j++)
{
printf("%3c",matrix[i][j]);
}
printf("\n");
}
}
int computeLength(char str[50]){
int i;
for(i=0; str[i]!='\0'; ++i){}
return i;
}
int findString(char matrix[ROW][COLUNM],char string[15],int computeLength(string[15])){
int i,j,k,count=0;
for (i=0;i<180;i++){
for(j=0;j<ROW;j++){
for(k=0;k<COLUNM;k++){
if(string[i]==matrix[j][k]){
count++;
}
}
}
}
if(count==computeLength(string[15])){
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;
}
}
printPuzzle(matrix);
printf("%d",computeLength("küfür"));
return 0;
}
并且我现在收到此错误
c:29:76: error: expected declaration specifiers or ‘...’ before ‘*’ token
29 | int findString(char matrix[ROW][COLUNM],char string[15],int computeLength(*string[15])){
我不认为使用python很难实现,但是我对C并不熟悉,以至于我不肯收到错误和警告。
仅需要工作的部分是第三功能。不要打扰输入,因为我会自己进行测试。
您能帮忙吗?
已经有一个C函数可以计算C字符串长度:
#include <string.h>
...
const char* string = "hello";
int length = strlen(string);
...
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]);
可以替换为
之后,索引必须为0,实际上您可以只给出scanf("%s",&matrix[i][0]);
(我使用0而不是j,因为它更清楚,它不要求我们检查
j值0)] >>而不是j。但是这还不够,如果输入无效,scanf
可以读取多个COLUNM个字符,甚至您输入的12个字符也可以忘记scanf也会写入空字符完成字符串,因此它写入13个字符。一种方法是读入比[[COLUMN
多2的string”,并检查输入字符串的长度。因此,您的for可以替换为:也请注意在末尾i
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++; }
在while
循环中scanf("%s",&string[50]);
是无效的,因为它将结果放在string
string。和以前一样,如果输入的字符数超过49个,[[scanf将从循环没有任何作用,很可能您想在其中调用findString并写入返回的值,直到第一个读取字符为q或Q。实例:string中写出,所以]]
scanf("%49s", string);
如果要允许搜索50个字符的字符串而不计算最终的空字符,则必须将其大小设置为51,并将49替换为50。退出打印并读取while
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并增加下一个错误:count == computeLength(string)
您未正确搜索难题中的字符串,因为在
),最糟糕的情况是当其长度为时将访问其中的180个字符仅49(不带最后一个空字符)。即使找到了字符串,您也不会停止搜索。在您的算法中,您忘记了字符串的字符必须连续放置在矩阵中,每当您(错误地)在矩阵中的任何位置发现字符串的字符时,您递增- i
上的第一个循环通过了字符串(string [i]count。仅考虑您从左到右水平搜索字符串: string
上的循环必须是嵌入度更高的循环,以检查其字符在矩阵中是否连续。您在行上有一个循环,在列上有一个循环,这是无用的,只会使工作变得一无所有。因为
matrix是一个数组,所以
处的字符,这意味着您可以遍历matrix 就像是一个- matrix [r] [COLUMN]
处的字符是matrix [r + 1] [0]
ROW * COLUMN个字符的字符串。 ,除了您返回索引或-1而不是子字符串的地址或NULL我让您重写findString
,它类似于strstr