所以我一直在研究這一點,並且我遇到了一些奇怪的問題。最終目標是通過空格和引號將輸入字符串分開(即,「這是一個非常」非常複雜「的例子,這是一個非常非常複雜的例子)。現在看來,除了第一個字符串之外,它正確地將其分開。嘗試使用空格和引號來標記字符串
這(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