在C中分割char数组,同时保留定界符

时间:2019-02-21 01:52:18

标签: c regex split

所以我正在C语言中工作,并且有一个char数组,我想在每次有空格“(”,“)”或“ {”时都将其拆分。但是,我想保留那些字符定界符。例如,如果我输入的是

void statement(int y){

我希望输出为

void statement ( int y ) {

解决此问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

您可以通过选择的循环和一些条件测试来做到这一点,这些条件测试基本上可以归结为:

  1. 如果当前字符是定界符;
  2. 如果先前的字符不是定界符,请在定界符之前输出一个空格;
  3. 如果定界符(当前字符)不是空格,则输出char,后跟换行符。

(使用定界符字符串作为strchr中的字符串并检查当前字符是确定当前字符是否为delim的简单方法)

在一个简短的示例中将其组合在一起,您可以执行以下操作:

#include <stdio.h>
#include <string.h>

int main (void) {

    int c, last = 0;                    /* current & previous char */
    const char *delims = " (){}";       /* delimiters */

    while ((c = getchar()) != EOF) {    /* read each char */
        if (strchr (delims, c)) {       /* if delimiter */
            if (last && !strchr (delims, last)) /* if last not delimiter */
                putchar ('\n');         /* precede char with newline */
            if (c != ' ') {             /* if current not space */
                putchar (c);            /* output delimiter */
                putchar ('\n');         /* followed by newline */
            }
        }
        else    /* otherwise */
            putchar (c);                /* just output char */
        last = c;                       /* set last to current */
    }
}

使用/输出示例

给出您的输入字符串,输出与您提供的内容匹配。

$ printf "void statement(int y){" | ./bin/getchar_delims
void
statement
(
int
y
)
{

仔细检查一下,如果还有其他问题,请告诉我。

答案 1 :(得分:3)

您可以尝试使用strpbrk,它不仅可以通过简单地返回指向找到的定界符的指针来保留定界字符,而且还支持多个定界符。

例如,这应该做您想要的:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
    char *input = "void statement(int y){a";
    char *delims = " (){";
    char *remaining = input;
    char *token;

     // while we find delimiting characters
    while ((token = strpbrk(remaining, delims)) != NULL) {
         // print the characters between the last found delimiter (or string beginning) and current delimiter
        if (token - remaining > 0) {
            printf("%.*s\n", token - remaining, remaining);
        }

         // Also print the delimiting character itself
        printf("%c\n", *token);

         // Offset remaining search string to character after the found delimiter
        remaining = token + 1;
    }

     // Print any characters after the last delimiter
    printf("%s\n", remaining);

    return 0;
}

由于您将用作分隔符,因此输出中包含空格。如果您不希望这样做,请在这样的条件下包装定界字符:

    if (*token != ' ') {
        printf("%c\n", *token);
    }