我想要这样做的原因是因为我想逐行读取文件,并且每行检查它是否与正则表达式匹配。我正在使用getline()函数,它将行放入char *
类型变量。我正在尝试使用regexec()
检查正则表达式匹配,但此函数希望您提供匹配为const char *
的字符串。
所以我的问题是,我可以从const char *
创建char *
吗?或者是否有更好的方法来解决我试图在这里解决的问题?
编辑:我被要求提供一个例子,我没有想到并为没有首先给出一个而道歉。在写这篇文章之前,我确实读过@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 matches\n", line);
}
}
fclose(file);
return 0;
}
答案 0 :(得分:5)
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
会修改目标字符串,但不会修改源字符串。
编辑:您的问题与constness转换无关:
您没有检查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;
}