C - 我可以从char *创建一个const char *变量吗?

时间:2016-11-17 00:04:49

标签: c regex getline c-strings string-literals

我想要这样做的原因是因为我想逐行读取文件,并且每行检查它是否与正则表达式匹配。我正在使用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(&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 个答案:

答案 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(&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;
}