我正在尝试将字母表中的字母添加(或附加)到一个空的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;
}
答案 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;
}