需要帮助理解指针,函数和2D数组

时间:2018-02-22 12:59:55

标签: c arrays function

以下是解析令牌并存储它们的代码片段。代码编译和工作。

代码

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传递给函数。

2 个答案:

答案 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>