所以我一直在研究这一点,并且我遇到了一些奇怪的问题。最终目标是通过空格和引号将输入字符串分开(即,“这是一个非常”非常复杂“的例子,这是一个非常非常复杂的例子)。现在看来,除了第一个字符串之外,它正确地将其分开。尝试使用空格和引号来标记字符串
这(BUFF被传递与来自函数getline的值):
char **tokens = (char **)malloc(sizeof(char));
char *temp;
int count = 0;
int prev = 0;
// Get tokens
for (int i = 0; i <= strlen(command) && running; i++) {
if (i > prev && strncmp((buff + i), " ", 1) == 0) {
temp = (char **)realloc(tokens, (sizeof(char)) * WORD_SIZE * (++count));
if (temp == NULL) {
fprintf(stderr, "Error in parsing: ran out of memory\n");
running = false;
free(tokens);
}
else {
tokens = temp;
*(temp) = (buff + i);
strncpy(*(temp), "\0", 1);
temp = tokens + WORD_SIZE * (count - 1);
*(temp) = buff+prev;
prev = i+1;
}
}
else if (strncmp((buff + i), "\"", 1) == 0) {
*(temp) = (buff + i);
strncpy(*(temp), "\0", 1);
i++;
prev = i;
for (; strncmp((buff + i), "\"", 1) != 0; i++) { }
temp = (char **)realloc(tokens, (sizeof(char)) * WORD_SIZE * (++count));
if (temp == NULL) {
fprintf(stderr, "Error in parsing: ran out of memory\n");
running = false;
free(tokens);
}
else {
tokens = temp;
*(temp) = (buff + i);
strncpy(*(temp), "\0", 1);
temp = tokens + WORD_SIZE * (count - 1);
*(temp) = buff+prev;
prev = i+1;
}
}
else if (strncmp((buff + i), "\0", 1) == 0) {
temp = (char **)realloc(tokens, (sizeof(char)) * WORD_SIZE * (++count));
if (temp == NULL) {
fprintf(stderr, "Error in parsing: ran out of memory\n");
running = false;
free(tokens);
}
else {
tokens = temp;
temp = tokens + WORD_SIZE * (count - 1);
*(temp) = buff+prev;
prev = i+1;
}
}
}
for (int i = 0; i < count; i++)
printf("\t%i: %s\n", i, *tokens + sizeof(char) * WORD_SIZE * i);
现在,如果我输入“这是一个测试”(不包括引号),我得到:
0:
1:
2:一个
3:测试
报价多一点搞砸了,因为 “这个\” 是\ “非常\ ”非常复杂的\“ 测试” 我得到:
0:
1:是一个
2:
3:非常复杂
4:测试
首先OBSN。 (但 - 可能 - 与你的问题无关):你需要在'char ** tokens =(char **)malloc(sizeof(char));'中分配sizeof(char *)'',而不是'sizeof char)'(通常是'1')。 (另外,不需要在C中使用'malloc') – usr2564301
@Jongware是的,我继续改变它,但是在添加每个标记(包括第一次)之前重新分配指针,所以malloc实际上只是一个形式上,它的大小并不重要。 – Michael
抓好@Jongware。实际上'sizeof(char)'是_always_ 1. – Gene