我试图在每次出现右括号时分割一个字符串,并在 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/