以下是解析令牌并存储它们的代码片段。代码编译和工作。
代码
2
输出
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int storeTokens(char *src, char *delim, char **storage, size_t len) {
int idx = 0;
char str[100] = {0};
char *token = NULL;
char *saveptr = NULL;
// copy string so we don't modify the source
if (snprintf(str, sizeof(str), "%s", src) < 0) {
return 0;
}
// Loop through string and parse out tokens
token = strtok_r(str, delim, &saveptr);
while ((token != NULL) && (idx < len)) {
snprintf(storage[idx], sizeof(storage[idx]), "%s", token);
strcpy(storage[idx++], token);
token = strtok_r(NULL, delim, &saveptr);
}
// Print the tokens
int i = 0;
for (i = 0; i < idx; i++) {
printf("fun: %s\n", storage[i]);
}
return idx; // number of tokens found
}
int main() {
int i = 0;
char teststr[] = "This*is*my*string*.";
char *storageptr[72];
char storage[72][255];
// Assign storage space to the pointers
for (i = 0; i < 72; i++) {
storageptr[i] = storage[i];
}
// Parse the tokens
int numtokens = storeTokens(teststr, "*", storageptr, 72);
// Print the tokens
for (i = 0; i < numtokens; i++) {
printf("storage: %s\n", storage[i]);
}
return EXIT_SUCCESS;
}
该函数存储带有fun: This
fun: is
fun: my
fun: string
fun: .
storage: This
storage: is
storage: my
storage: string
storage: .
变量的字符串。这是一个双指针的原因是这个函数可以在任何存储上使用,无论长度如何。
我的问题是将存储传递给函数。正如您在char **storage
中看到的那样,我创建main
以指向storageptr
,然后再将其传递给函数。
这似乎是错综复杂和不必要的。更不用说浪费循环和链接每个字符串的时间。但是,我无法弄清楚如何在不创建storage
的情况下将storage
直接传递到函数中。
我已经完成了Passing an array of strings to a C function by reference之类的阅读,但没有真正点击过。我似乎无法弄清楚如何正确地将storageptr
传递给函数。
答案 0 :(得分:1)
除非你需要将参数保持为指向指针(指向char
)的指针,否则能够直接传递数组(char
)你需要改变功能签名:
int storeTokens(char *src, char *delim, char (*storage)[255], size_t len)
// ^^^^^^^^^^^^^^^
现在,您可以从storage
函数传递main
:
storeTokens(teststr, "*", storage, 72)
问题在于,虽然数组可以衰减到指向其第一个元素的指针,但它并不是&#34;递归&#34;。
如果你有像你这样的阵列
char storage[72][255];
然后当它衰减到指向其第一个元素的指针时,它是&storage[0]
,它是指向数组的指针。此辅助数组不会衰减,因此传递storage
会将指针传递给数组(类型为char (*)[255]
)。
如果必须传递char **
,则需要中间storageptr
数组。
答案 1 :(得分:1)
使用具有可选VLA支持的C99或C11兼容编译器,您可以直接传递2D数组,动态指定数组的大小:
int storeTokens(char *src, char *delim, size_t len, size_t size, char storage[len][size]);
来自main的电话:
int numtokens = storeTokens(teststr, "*", 72, 255, storage);
如果您有C11编译器以确保它支持VLA(对于C11是可选的),请检查符号 STDC_NO_VLA ,如果已定义编译器不支持VLA&#39> 。