C中的数组指针问题-数组仅包含最后一个值

时间:2019-03-20 21:45:13

标签: c arrays

我正在尝试将字母表中的字母添加(或附加)到一个空的char数组中。但是,我似乎遇到了某种我不了解的指针问题,因为我的数组仅包含最后一个字符。我尝试将字母char移到for循环之外,但是编译器不喜欢这样。我还研究了如何创建所有字母字符的列表,更好的答案之一是一次将所有字符都键入1。但是,我的问题意味着我不完全了解C中的循环和指针,而我想要。

#include <stdio.h>

int main(void) {

    char *empty_list[26];

    for (int i = 0; i < 26; i++){
        char letter = i + 65;
        empty_list[i] = &letter;
    }

    printf("%s", *empty_list);

    return 0;
}

3 个答案:

答案 0 :(得分:3)

主要问题是您的声明:

char *empty_list[26];

定义一个由26个指向字符的指针组成的数组。在当前代码中,为数组中的每个元素分配变量字母的地址。由于这在打印时超出范围,因此很幸运,它可以打印出最后一个,因此,如果它们之间的代码很复杂,它可能同样会打印出垃圾或崩溃。由于无法知道字母后是否有字符串终止字符(\ 0),因此它也可能会在字母后用您已经拥有的内容打印出其他垃圾。在您现有的代码中,printf("%s", *empty_list);将数组中的第一个指针打印为以空终止的字符串,如果您忽略范围的丢失并假设内存内容仍然存在,它将是循环中的最后一个值,因为所有指针在您的数组中,指向存储该字母的内存,并且该内存具有循环中的最后一个值。

如果您打算用字母创建一个数组,则应为:

char empty_list[27];

它必须为27,因为您需要在末尾保留用于字符串终止字符的空间。填写此内容的一种方法是使用:

empty_list[26] = '\0';

for循环结束之后并在打印数组内容之前(此处不包括星号-因为它是一个数组,编译器会自动获取第一个元素的地址):

printf("%s", empty_list);

正如注释中提到的妓院,当您将字母的值分配给数组中的元素时,它应该没有与号:

empty_list[i] = letter;

答案 1 :(得分:2)

您的代码有些错误。

首先,empty_list的类型目前是指向char的指针数组,而实际上它应该是char的数组,因为您的意图是像打印输出一样循环后调用printf的是后者。 char empty_list[26];是正确的声明。

第二,在循环中,当您只需要&letter时分配letter。哎呀,您甚至不需要中间变量letter。仅empty_list[i] = i + 'A';就足够了。

最后,您将empty_list传递给printf来满足格式说明符%s,该说明符期望以空字符结尾的字符串。您需要做的是向empty_list添加另一个元素,并将其设置为零:

char empty_list[27];
// populated 0..25 with 'A'..'Z' in your code...

empty_list[26] = '\0';

printf("%s\n", empty_list);
// Output: ABC...Z

答案 2 :(得分:0)

有了上述帮助(非常感谢),我在C中创建字母数组的工作代码如下:

#include <stdio.h>

int main(void) {

    // create an array with 1 extra space for null terminator 
    char empty_list[27];

    // add null terminator so string knows when it's finished.
    empty_list[26] = '\0';

    for (int i = 0; i < 26; i++){
        // add 65 to get ASCII value for 'A'
        char letter = A + i;
        // insert each char into the array sequentially
        empty_list[i] = letter;
    }

    printf("%s", empty_list);

    return 0;
}