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(&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

请[编辑]包括一个[MCVE]认为演示您遇到的问题,以及您看到的确切错误消息。 –

+0

@KenWhite示例添加! –

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(&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

谢谢你的回答!我在我的问题中添加了一个示例,以更好地说明我正在尝试执行的操作。我明天会回到这里并且继续努力,看看我能否解决我的问题,如果答案是肯定的,我会接受它。 –

+0

@JohnDoe:我为您的具体问题更新了答案。 – chqrlie

+0

感谢您的详细解答! –