基本的に、次のようなファイル内の単語の配列を見つけるという問題をほぼ解決しました。
aaaaaaaaaaaaaaaaaaaaa
setrsdfdsrrtdpyrinoeq
weraderelefantewwerrr
trtevhjujhaspescadito
rtxvfdghhgperrodrdvbh
ifghhfgaaasdserpiente
naendsdsadsasafrrsdft
nssdofgfgghghghdddddd
ttegatovvvfgfyhgggggg
rrrrrrrrrrrrrrrrrrrrr
他のファイルで見つかった座標を出力します。
ただし、縦方向の単語を検索する方法がわかりません。コードは行ごとに単語を検索し、見つかった場合はその座標を返します。
縦方向の単語を検索するために別の機能を実装する必要があることはわかっていますが、最善のアプローチは何でしょうか?
what_coor 関数を変更して垂直方向の単語を検索する方法は? たとえば、「ant」という単語を見つけることができます
aaaaaaaaaaaaaaaaa*a*aaa
bbbbbbbbbbbbbbbbb*n*bbb
rrrrrrrrrrrrrrrrr*t*rtr
コードは次のとおりです。
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>
#define MAX_OF_LINE 180 //max length of a line
//search a word in a line if is there returns coordinate
int what_coor ( const char *line, const char *word ){
const char *p, *x,*y;
for ( p = line; *p != '\0'; p++ ) {
x = p;
y = word;
for ( ; *x != '\0' && *y != '\0' && *x == *y; x++, y++ )
;
if(*y == '\0')
return p - line + 1;
}
return -1;
}
//reservamos espacio para nuestro myArray 'bidimensional'
char **askMemory(int filas, int cols){
char **myArray;
int i;
/* espacio para el myArray de apuntadores a entero*/
myArray = (char**)malloc(filas * sizeof(char*));
if(myArray == NULL){
fprintf(stderr, "Error 1-d \n");
exit(-1);
}
/* espacio para los myArrays de letras */
for(i = 0; i < filas; i++){
myArray[i] = (char*)malloc(cols * sizeof(char));
if(myArray[i] == NULL){
fprintf(stderr, "Error 2-d\n");
exit(-1);
}
}
return myArray;
}
//returns bidimensional array, filling it with a file
char **read (int *ptrNumWords, char *fileName) {
char line[MAX_OF_LINE];
char **myArray;
int i;
FILE *f;
if ( ! ( f = fopen (fileName, "r") ) ) {
printf ("error opening %s\n", fileName);
exit (-1);
}
while ( fgets (line, MAX_OF_LINE, f) ) {
*ptrNumWords = *ptrNumWords+1;
}
myArray = askMemory (*ptrNumWords, MAX_OF_LINE);
rewind (f);
for ( i=0 ; i <*ptrNumWords ; i++ ) {
fgets (myArray[i], MAX_OF_LINE, f);
myArray[i][strlen(myArray[i])] = '\0';
}
fclose (f);
return (myArray);
}
//seacrh word and writes output
void searchForIt(int rows, char **array2d , char *target){
FILE *sal;
sal = fopen("out.txt","a+");
int i, col;
for ( i = 0; i < rows; i++ ) {
col = what_coor ( array2d[i], target );
if( col != -1 ){
fprintf(sal,"\"%s\" \t found on (%d,%d)\n",target, i+1, col);
printf ( "\"%s\" \t found on (%d,%d)\n", target, i+1, col );
}
}
fclose(sal);
}
int main (){
int ptrNumWords = 0;
int i=0;
char **array2d;
array2d = read(&ptrNumWords, "in.txt");
char *wordsBusca[] = {"gato", "perro", "raton", "elefante", "rino", "serpiente", "pescadito"};
int len = sizeof(wordsBusca) / sizeof(char *) ;
for(i =0; i< len; i++){
searchForIt(ptrNumWords,array2d, wordsBusca[i] );
}
getch();
return 0;
}