c - 根据特定字符的出现分割字符串

标签 c arrays string char strtok

我试图在每次出现右括号时分割一个字符串,并在 while 循环中将其作为一行一行发送到字符数组。 这是我在 char * input 中阅读的输入

(000,P,ray            ),(100,D,ray            ),(009,L,art            ),(0000,C,max            ),(0000,S,ben            ),(020,P,kay            ),(040,L,photography    ),(001,C,max            ),(0001,S,ben            ),(0001,P,kay            )

这是我试图在 char each[30] = {} 中生成的输出

(000,P,ray            ),
(100,D,ray            ),
(009,L,art            ),
(000,C,max            ),
(000,S,ben            ),
(020,P,kay            ),
(040,L,photography    ),
(001,C,max            ),
(201,S,ben            ),
(301,P,kay            )

我将输入复制到 char * temp这样strtok()不改变输入。但我不明白如何使用 strtok()在 while 循环条件内。有谁知道怎么做吗?

谢谢

更新: 抱歉,如果我违反了规则。 这是我的代码 -

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


int main(int argc, char *argv[]){
  size_t len = 0;
  ssize_t read;
  char * line = NULL;
  char *eacharray;
  FILE *fp = fopen(argv[1], "r");
  char * each = NULL;
  while ((read = getline(&line, &len, fp)) != -1) {
    printf("%s\n", line);
    eacharray = strtok(line, ")");
//      printf("%s +\n", eacharray);
    while(eacharray != NULL){
        printf("%s\n", eacharray);
        eacharray = strtok(NULL, ")");
    }
  }
  return 0;
}

它产生这样的输出 -

(000,P,ray            
,(100,D,ray            
,(009,L,art            
,(0000,C,max            
,(0000,S,ben            
,(020,P,kay            
,(040,L,photography    
,(001,C,max            
,(0001,S,ben            
,(0001,P,kay

最佳答案

我不会使用strtok,因为你的简单解析器应该首先检测左大括号,然后搜索右大括号。使用 strtok,您可以在右大括号处进行拆分;那么你就无法检查是否有左大括号,并且必须“手动”跳过这些字符,直到下一个左大括号。

顺便说一句:您可能指的是 each[10][30],而不是 each[30]

请参阅以下代码,查找左大括号和右大括号并复制其间的内容(包括大括号):

int main(int argc, char *argv[]) {

    const char* source ="(000,P,ray            ),"
                        "(100,D,ray            ),"
                        "(009,L,art            ),"
                        "(0000,C,max            ),"
                        "(0000,S,ben            ),"
                        "(020,P,kay            ),"
                        "(040,L,photography    ),"
                        "(001,C,max            ),"
                        "(0001,S,ben            ),"
                        "(0001,P,kay            )";

    char each[10][30] = {{ 0 }};
    const char *str = source;
    int i;
    for (i=0; i<10; i++) {
        const char* begin = strchr(str, '(');
        if (!begin)
            break;

        const char* end = strchr(begin,')');
        if  (!end)
            break;

        end++;
        ptrdiff_t length = end - begin;
        if (length >= 30)
            break;

        memcpy(each[i], begin, length);

        str = end;
    }

    for (int l=0; l<i; l++) {
        printf("%s", each[l]);
        if (l!=i-1)
            printf(",\n");
    }
    putchar ('\n');
}

希望有帮助。

关于c - 根据特定字符的出现分割字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48329572/

相关文章:

arrays - 为什么当通过 ParamArray 将数组元素传递给函数时,函数中会到达 varpointer?

python - 替换 x 轴值

php - 不在 CODEIGNITER Mysql 中插入数据库

string - 提取给定字符串之间的子字符串

c - 将数据写入 wav 文件

c - 我如何保存 ANSI C 数组中位置的值和索引?

c++ - C#define 嵌套在 #ifdef 中

c - 不透明数据类型的静态分配

c++ - 在 C/C++ 中连接字符串

C++ 打印 : newline (\n) from commandline argument