2016-11-17 5 views
3

Der Grund, warum ich dies tun möchte, ist, weil ich von einer Datei Zeile für Zeile lesen möchte, und für jede Zeile überprüfen, ob es eine Regex entspricht. Ich benutze die Funktion getline(), die die Zeile in eine char * Variable einfügt. Ich versuche regexec() zu verwenden, um nach einer Regex-Übereinstimmung zu suchen, aber diese Funktion möchte, dass Sie die Zeichenfolge angeben, die als const char * übereinstimmt.C - Kann ich eine const char * Variable von char * erstellen?

Also meine Frage ist, kann ich eine const char * aus einer char * erstellen? Oder gibt es vielleicht einen besseren Weg, das Problem anzugehen, das ich hier zu lösen versuche?

EDIT: Ich wurde gebeten, ein Beispiel zu geben, worüber ich nicht nachgedacht habe und entschuldige mich dafür, dass ich gar keins gegeben habe. Ich habe die Antwort von @chqrlie vor dem Schreiben gelesen. Der folgende Code gibt einen Segmentierungsfehler an.

#define _GNU_SOURCE                         
#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <string.h> 
#include <stdbool.h> 
#include <regex.h> 

int main() { 
    FILE * file = fopen("myfile", "r"); 
    char * line = NULL; 
    size_t len = 0; 
    ssize_t read; 

    regex_t regex; 
    const char * regexStr = "a+b*"; 

    if (regcomp(&regex, regexStr, 0)) { 
    fprintf(stderr, "Could not compile regex \"%s\"\n", regexStr); 
    exit(1); 
    } 

    while ((read = getline(&line, &len, file)) != -1) { 
    int match = regexec(&regex, line, 0, NULL, 0); 

    if (match == 0) { 
     printf("%s matches\n", line); 
    } 
    } 

    fclose(file); 

    return 0; 
} 
+1

Bitte [Bearbeiten] enthalten eine [MCVE], dass zeigt das Problem, das Sie haben, sowie die genaue Fehlermeldung, die Sie sehen. –

+0

@KenWhite Beispiel hinzugefügt! –

Antwort

5

char * kann ohne spezielle Syntax zu const char * umgewandelt werden. Die const in diesem Typ bedeutet, dass die Daten, auf die der Zeiger zeigt, nicht über diesen Zeiger geändert werden.

char array[] = "abcd"; // modifiable array of 5 bytes 
char *p = array;  // array can be modified via p 
const char *q = p;  // array cannot be modified via q 

Hier sind einige Beispiele:

int strcmp(const char *s1, const char *s2); 
size_t strlen(const char *s); 
char *strcpy(char *dest, const char *src); 

Wie Sie sehen können, strcmp verändert nicht die Saiten es Zeiger auf empfängt, aber man kann natürlich regelmäßig char * Zeiger auf sie passieren.

In ähnlicher Weise ändert strlen die Zeichenfolge nicht, und strcpy ändert die Zielzeichenfolge, aber nicht die Quellenzeichenfolge.

EDIT: Sie Problem nichts mit Konstantheit Umwandlung zu tun hat:

  • Sie prüfen nicht den Rückgabewert von fopen(), erzeugt das Programm einen Segmentation Fault auf meinem System, weil myfile existiert nicht.

  • Sie müssen REG_EXTENDED passieren einen regulären Ausdruck mit der neueren Syntax wie a+b*

hier zu kompilieren ist eine korrigierte Version:

#define _GNU_SOURCE 
#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <regex.h> 

int main() { 
    FILE *file = fopen("myfile", "r"); 
    char *line = NULL; 
    size_t len = 0; 
    ssize_t read; 

    regex_t regex; 
    const char *regexStr = "a+b*"; 

    if (file == NULL) { 
     printf("cannot open myfile, using stdin\n"); 
     file = stdin; 
    } 

    if (regcomp(&regex, regexStr, REG_EXTENDED)) { 
     fprintf(stderr, "Could not compile regex \"%s\"\n", regexStr); 
     exit(1); 
    } 

    while ((read = getline(&line, &len, file)) != -1) { 
     int match = regexec(&regex, line, 0, NULL, 0); 
     if (match == 0) { 
      printf("%s matches\n", line); 
     } 
    } 

    fclose(file); 
    return 0; 
} 
+0

Danke für die Antwort! Ich habe meiner Frage ein Beispiel hinzugefügt, um besser zu veranschaulichen, was ich zu tun versuche. Ich werde morgen darauf zurückkommen und etwas mehr daran arbeiten, um zu sehen, ob ich mein Problem mit deiner Antwort lösen kann, ich werde es akzeptieren, wenn es das tut :). –

+0

@JohnDoe: Ich habe die Antwort für Ihr spezifisches Problem aktualisiert. – chqrlie

+0

Danke für die ausführliche Antwort! –

Verwandte Themen