C-могу ли я создать переменную const char * из char *?



Причина, по которой я хотел бы сделать это, заключается в том, что я хочу читать из файла построчно и для каждой строки проверять, соответствует ли она регулярному выражению. Я использую функцию getline (), которая помещает строку в переменную типа char *. Я пытаюсь использовать regexec() для проверки соответствия регулярных выражений, но эта функция хочет, чтобы вы предоставили строку для соответствия в виде const char *.



Итак, мой вопрос в том, Могу ли я создать const char * из char *? Или, возможно, есть лучший способ подойти к проблеме, которую я пытаюсь решить решить здесь?

[6]}EDIT: меня попросили привести пример, о котором я не подумал, и извиниться за то, что не привел его в первую очередь. Я прочитал ответ @chqrlie, прежде чем написать это. Следующий код дает ошибку сегментации.

#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 matchesn", line);
}
}

fclose(file);

return 0;
}
1023   1  

1 ответ:

char * может быть преобразован в const char * без специального синтаксиса. const в этом типе означает, что данные, на которые указывает указатель, не будут изменены с помощью этого указателя.

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

Вот несколько примеров:

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

Как вы можете видеть, strcmp не изменяет строки, на которые он получает указатели, но вы, конечно, можете передать ему обычные char * указатели.

Аналогично, strlen не изменяет строку, а strcpy изменяет строку назначения, но не источник строка.

EDIT: ваша проблема не имеет ничего общего с преобразованием константы:

  • Вы не проверяете возвращаемое значение fopen(), программа производит ошибку сегментации в моей системе, потому что myfile не существует.

  • Вы должны передать REG_EXTENDED, чтобы скомпилировать регулярное выражение с более новым синтаксисом, таким какa+b*

Вот исправленная версия:

#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;
}

Comments

    Ничего не найдено.