txtファイルに入ってる文字列から、コマンドで入力された文字を検索してその文字が入ってる行番号も一緒に返したいです。
しかしバグがあって、検索できない文字列があったり、検索した文字が入ってない行も返ってしまいます。
よろしかったらこのバグを教えてください。
ソース↓
lang
1 2#include <stdio.h> 3#include <string.h> 4#include <math.h> 5 6#define N 3 7#define SIZE 100 8#define MAX 10000 9int sindex[MAX][SIZE] = { {0} }; 10char line[MAX][SIZE] = {}; 11 12int make_index( char* path ); 13int search( char* str ); 14 15/* 4文字以上の文字列の検索 */ 16int main(void) 17{ 18 make_index( "./doc.txt" ); 19 char input[SIZE]; 20 int j, k, c, t; 21 while(1){ 22 printf("検索したい文字列(%d文字以上)を入力してください。: ", N+1); 23 scanf("%s", input); 24 if ( strcmp(input, "q" )==0 ){ break; } 25 int len = strlen( input ); 26 if ( len < N+1 ){ 27 printf("入力した文字列は%d文字未満です。\n", N+1); 28 continue; 29 } 30 c = 0; 31 t = 0; 32 int count_list[SIZE][MAX] = {{0}}; 33 for( k=0; k < SIZE-N; k++ ){ 34 if ( input[k+N-1] == '\0' || input[k+N-1] == '\n'){ break; } 35 char buf[N]; 36 int m; 37 for( m = 0; m < N; m++ ){ buf[m] = input[k+m]; } 38 int i = search( buf ); 39 if ( i >= 0 && i < MAX ){ 40 for ( j = 0; j < SIZE; j++ ){ 41 if ( sindex[i][j] > 0 ){ 42 count_list[j][i]++; 43 c++; 44 }else{ 45 count_list[j][i] = 0; 46 } 47 } 48 } 49 t++; 50 } 51 52 int m = 0; 53 int k = 0; 54 int x = 0; 55 for( j = 0; j < SIZE; j++ ){ 56 m = 0; 57 for ( k = 0; k < MAX; k++ ){ 58 if ( count_list[j][k] > 0 ){ m+=count_list[j][k]; } 59 } 60 if ( m >= t ){ 61 printf("\t[%d]\t[%s]\n", j+1, line[j]); 62 x++; 63 } 64 } 65 if ( x > 0 ){ 66 printf("==> %d 件見つかりました。\n", x ); 67 } 68 else{ 69 printf("%s は見つかりませんでした。\n", input); 70 } 71 } 72 return -1; 73} 74 75// インデックス配列から検索 76// 見つかったら第1添え字を返す 77int search( char* str ) 78{ 79 int y = 0; 80 int j; 81 for ( j = 0; j < N; j++ ) 82 y += ( str[j] - '0' ) * pow(10,j); 83 return y; 84} 85 86// ファイルからインデックスの作成 87int make_index( char* path ) 88{ 89 FILE* fp = fopen( path, "r" ); 90 if ( fp == NULL ){ 91 printf("%s: file open error.\n", path ); 92 return -1; 93 } 94 int i, j, x; 95 char s[256]; 96 // インデックス配列の初期化 97 for (i=0; i<MAX; i++){ 98 for(j=0; j<SIZE; j++){ 99 sindex[i][j] = 0; 100 } 101 } 102 x = 0; 103 while( fgets( s, SIZE, fp ) != NULL ){ 104 strcpy( line[ x ], s ); 105 for( i=0; i<SIZE; i++){ 106 for( j = 0; j<SIZE; j++){ 107 if ( line[i][j] == '\n' ){ line[i][j] = '\0'; break; } 108 } 109 } 110 for( i=0; i < SIZE-N; i++ ){ 111 char ngram[N]; 112 int y = 0; 113 for ( j = 0; j < N; j++ ){ 114 if ( s[i+j] == '\0' || s[i+j] == '\n' || s[i+j] == '_'){ break; } 115 y += ( s[i+j] - '0' ) * pow(10,j); 116 } 117 if ( j == N ){ 118 sindex[y][x] += 1; 119 } 120 } 121 x++; 122 } 123 fclose(fp); 124 return 1; 125}

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。