C - 我可以从char *创建一个const char *变量吗?
我想这样做的原因是因为我想逐行读取文件,并为每一行检查它是否匹配正则表达式。我正在使用getline()函数,该函数将该行放入一个char *
类型变量中。我正在尝试使用regexec()
来检查正则表达式匹配,但此函数要求您提供匹配的字符串作为const char *
。C - 我可以从char *创建一个const char *变量吗?
所以我的问题是,我可以从char *
创建一个const 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;
}
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
会修改目标字符串,但不会修改源字符串。
编辑:您的问题无关,与常量性转换:
你不检查
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;
}
谢谢你的回答!我在我的问题中添加了一个示例,以更好地说明我正在尝试执行的操作。我明天会回到这里并且继续努力,看看我能否解决我的问题,如果答案是肯定的,我会接受它。 –
@JohnDoe:我为您的具体问题更新了答案。 – chqrlie
感谢您的详细解答! –
请[编辑]包括一个[MCVE]认为演示您遇到的问题,以及您看到的确切错误消息。 –
@KenWhite示例添加! –