2

私の質問は2つあります。

私はPOSIX正規表現を使用しており、パターンマッチ用にかなり優れたシステムを設定して機能していましたが、特にサブ部門では、文字列操作に対するCの低レベル/使いにくいサポートを処理するのは非常に困難でした。 -文字列メソッド。次の例はビネットではないことを知っているので、ご容赦ください。ただし、このセクションでは、POSIX正規表現の設定方法と使用方法を示していると思います。私の主な質問は、パターンの一致ごとにPOSIXから文字列を抽出し、次のような通常のC文字列関数を安全に使用できる文字列/文字配列内に配置する方法です:http: //faculty.edcc.edu/ paul.bladek / c_string_functions.htm?パターンマッチングの内部構造体から文字列を取得できるようですが、パターンマッチの通常の部分文字列操作であると感じることを実行するたびに、Cは停止します。

次の例は、以前は機能していたコードを示していますが、変数「result」を配列から(char *)に変更し(古い方法はコメントアウトされています)、Cのメモリ割り当てメソッドを使用して実行することを決定するまではこの権利。出力でそれがどこまで到達するかを見ることができますが、変数「result」は正しく出力されますが、確認できない理由でstrstr(...)を使用すると、IF比較でプログラムがクラッシュします。

私の最後の質問、(char *)をNULLで終了する最良の方法は何ですか?どうやら、私が以下でそれをしている方法は問題かもしれません。

コード:(「ストレージ」は、パターンマッチングが実行されているテキストを含む大きなサイズの文字配列であることに注意してください)

regex_t r;  // stores regex
regmatch_t m[50];  // stores parts of file-string that matched the regex
const char * p = storage; // pointer to string that will be read in by regexec(...)
char matches[tracker][BUFFSIZE]; // 2D array containing a collection of strings
int ind = 0;  // indexing variable "matches" array
printf("### Collecting Pattern Matches ###\n");
int regExErr1 = regcomp(&r, "<[^<>]+=[[:space:]]*\"[^\"]+\"", REG_EXTENDED|REG_NEWLINE);
if( regExErr1 ){ 
    fprintf(stderr, "Fail to compile regex!\n"); 
    exit(1); 
}
while(1){
    regExErr1 = regexec(&r, p, 10, m, 0);
    if( regExErr1 != 0 ){ 
        fprintf(stderr, "Done finding URL pattern matches...\n"); 
        break; 
    }   
    int i = 0;
    while(1){
        if(m[i].rm_so == -1){
            break;
        }
        printf("entering loop at index %i\n", i);
        int start = m[i].rm_so;
        int finish = m[i].rm_eo;
        //char result[(finish - start)];
        char * result = (char *) malloc(strcspn(strstr(p + start, "<"), ">"));
        //strcpy(result, strstr(("%.*s\n", (finish - start), p + start), "<"));
        strcpy(result,("%.*s\n", strcspn((p+ start), ">"), strstr(p + start, "<")));
        result[strcspn(result, ">")+1] = 0;
        printf("LOOKING AT:  %s\n", result);
        if(strstr(result, "href") != NULL || strstr(result, "HREF") != NULL || strstr(result, "src") != NULL){
            printf("## CONSIDERING:  %s\n", result);
            if(strstr(result, "http:") == NULL && strstr(result, "mailto") == NULL){
                printf("Pattern is a relative URL.\n");
                strcpy(result, strstr(result, "\"") + 1);
                result[strcspn(result, "\"")] = 0;
                strcpy(result, relativePathCondense(result, "."));
                strcpy(matches[ind], base);
                strcat(matches[ind], result);
                matches[ind][(strlen(base) + strlen(result))] = 0; // NULL terminate the string match in the collection
                printf("Stored %i ==  %s\n", ind, matches[ind]);
                ...
                ind++; // update the counter to the 2D record array "matches"
            }else if(strstr(result, "http:") != NULL || strstr(result, "mailto:") != NULL){
                printf("Pattern is an absolute URL.\n");
                strcpy(result, strstr(result, "\"") + 1);
                result[strcspn(result, "\"")] = 0;
                printf("Trimmed expression is %s\n", result);
                strcpy(matches[ind], result);
                matches[ind][strlen(result)] = 0; // NULL terminate the string match in the collection
                printf("Stored %i ==  %s\n", ind, matches[ind]);
                ...
                ind++;                  
            }
        }
        i++;
    }
    p += m[0].rm_eo; // this will move the pointer p to the end of last matched pattern and on to the start of a new one
}

出力:

### Collecting URL's from stored HTML source document! ###
entering loop at index 0
LOOKING AT:  <BODY BGCOLOR = "#FFFFF0">
Segmentation fault (core dumped)
4

1 に答える 1

1
    strcpy(result,("%.*s\n", strcspn((p+ start), ">"), strstr(p + start, "<")));

これはあなたが思っていることをしません...式("%.*s\n", ...は両方の式を評価するコンマ演算子の使用ですexpr, exprが、右側のexprの値を持っています。ここで使うつもりだったと思いますsprintf

(また、あまり詳しく数えないと、malloc1バイトが少なすぎる可能性があります。通常のイディオムはそうですstrlen(s) + 1が、私はあなたについてもっと深く考える必要がありますstrspn

于 2013-03-14T17:54:34.957 に答える