【问题标题】:Incrementing the pointer to string array returns NULL递增指向字符串数组的指针返回 NULL
【发布时间】:2019-02-11 14:03:38
【问题描述】:

我正在尝试将一个字符串数组传递给一个函数以打印到屏幕上。第一个字符串打印正常。但是,后续字符串为空,因此不打印任何内容。如果我将指针直接指向第一个字符串而不是数组,我可以将它增加字符数组的大小,并且所有内容都可以正确打印。如果我尝试增加指向字符串数组的指针,这就是我得到空值的地方。为什么会发生这种情况以及如何正确打印数组。另外,考虑到它使用的 C 标准,如果这对它有任何影响,我也会使用 Visual Studio。

我认为错误不在于调用,因为传递的指针指向字符串数组地址。

//How I'm passing the array
char headings[4][20] = { "Name", "Record Number", "Quantity", "Cost"};
int widths[4] = {20, 20, 20, 20 };
headers(&headings[0][0], &widths[0], 4);


//Function
void headers(char **heads, int *columnWidths, int noOfColumns) {
    int headLength = 0;
    printf("|");
    for (int i = 0; i < noOfColumns; i++) {
        headLength += printf("%*s|", *columnWidths, heads);
        columnWidths++;
        heads ++;
    }
    printf("\n");
    for (int i = 0; i < headLength+1; i++) {
        printf("-");
    }
    printf("\n");
}

这是我得到的输出:

|                Name|                    |                    |                       |

但我期待这个输出:

|                Name|       Record Number|            Quantity|                   Cost|

【问题讨论】:

    标签: c arrays string pointers


    【解决方案1】:

    如果你有一个二维数组heading,你的headers 函数也应该接受一个二维数组。尽管数组在传递给函数时通常会衰减为指针,但类型 char** headschar headings[4][20] 不同。你的编译器也应该警告你。

    以下代码打印正确的输出。

    #include <stdio.h>
    #include <string.h>
    
    //Function
    void headers(char heads[4][20], int *columnWidths, int noOfColumns) {
        int headLength = 0;
        printf("|");
        for (int i = 0; i < noOfColumns; i++) {
            headLength += printf("%*s|", *columnWidths, *heads);
            columnWidths++;
            heads ++;
        }
        printf("\n");
        for (int i = 0; i < headLength+1; i++) {
            printf("-");
        }
        printf("\n");
    }
    
    int main(){
        char headings[4][20] = { "Name", "Record Number", "Quantity", "Cost"};
        int widths[4] = {20, 20, 20, 20};
        headers(headings, &widths[0], 4);
    }
    

    注意:您也可以将headers 函数更改为接受char heads[][20],但不接受char[][],因为这会给您带来明显的编译器错误。

    【讨论】:

    • 该函数被硬编码为 4 列,每列 20 个字符。这不是真正可重用的。
    【解决方案2】:

    您需要将headings 传递给您的函数,而不是第一个函数的第一个字符的地址。但在 C 中,多维数组是一种完全不同的类型,内存布局与array of char * 有很大不同。

    这是一个工作变体,支持任意维度,不像公认的解决方案只支持数组维度 4 字符串,每个字符串有 20 个字符:

    #include <stdio.h>
    #include <string.h>
    
    //Function
    void headers(const char **heads, int *columnWidths) {
        int headLength = 0;
        printf("|");
        while (*heads) {
            headLength += printf("%*s|", *columnWidths, *heads);
            columnWidths++;
            heads ++;
        }
        printf("\n");
        for (int i = 0; i < headLength+1; i++) {
            printf("-");
        }
        printf("\n");
    }
    
    int main(){
        const char *headings[] = { "Name", "Record Number", "Quantity", "Cost", 0};
        int widths[4] = {20, 20, 20, 20};
        headers(headings, &widths[0]);
    }
    

    我认为错误不在于调用,因为传递的指针指向字符串数组地址。

    没有。指向字符串数组的指针称为headings。这是一个 char 数组,有两个维度。如果不知道数组的布局,就不可能遍历单个字符串。

    相反,通常最好定义一个array of char * 并使用单独的字符串对其进行初始化。您可以看到数组内容的定义看起来与多维数组变体中的完全相同,但内存布局却大不相同,现在可以像您最初想要的那样迭代字符串。

    【讨论】:

    • 这不起作用,因为这是我尝试过的几种变体。正如 Mallone 先生所说,我的参数不正确,因此无法识别出我需要的属性。这完全解决了问题。
    猜你喜欢
    • 2013-09-27
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    相关资源
    最近更新 更多