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(®ex, regexStr, 0)) {
fprintf(stderr, "Could not compile regex "%s"n", regexStr);
exit(1);
}
while ((read = getline(&line, &len, file)) != -1) {
int match = regexec(®ex, line, 0, NULL, 0);
if (match == 0) {
printf("%s matchesn", line);
}
}
fclose(file);
return 0;
}
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(®ex, regexStr, REG_EXTENDED)) { fprintf(stderr, "Could not compile regex \"%s\"\n", regexStr); exit(1); } while ((read = getline(&line, &len, file)) != -1) { int match = regexec(®ex, line, 0, NULL, 0); if (match == 0) { printf("%s matches\n", line); } } fclose(file); return 0; }
Comments