[英]char double pointer confusing behaviour
我正在https://www.codingame.com/上练习以练习一些C指针。
任务是将输入字符转换为ASCII艺术。 例如,字母A为:
#
# #
###
# #
# #
https://www.codingame.com/ide/puzzle/ascii-art
整个ASCII字母作为不同行(A到Z加?)的单个输入提供:
# ## ## ## ### ### ## # # ### ## # # # # # ### # ## # ## ## ### # # # # # # # # # # ### ###
# # # # # # # # # # # # # # # # # ### # # # # # # # # # # # # # # # # # # # # # # # #
### ## # # # ## ## # # ### # # ## # ### # # # # ## # # ## # # # # # # ### # # # ##
# # # # # # # # # # # # # # # # # # # # # # # # # # ## # # # # # # # # ### # # # #
# # ## ## ## ### # ## # # ### # # # ### # # # # # # # # # ## # ### # # # # # # ### #
我正在尝试将字母存储为双指针(alphabet_input)。
char ** alphabet_input;
int main()
{
int length = 4;
int height = 5;
alphabet_input = (char **)malloc(sizeof(char *)*height);
for (int i = 0; i < height; i++) {
char ROW[1025];
fgets(ROW, 1025, stdin);
alphabet_input[i] = ROW;
// print alphabet lines for the first time
printf("%s", alphabet_input[i]);
}
// print alphabet lines for the second time
printf("%s", alphabet_input[0]);
printf("%s", alphabet_input[1]);
printf("%s", alphabet_input[2]);
printf("%s", alphabet_input[3]);
printf("%s", alphabet_input[4]);
return 0;
}
但是,当我尝试打印时,我会重复获得最后一行。 这就是我得到的结果:
# ## ## ## ### ### ## # # ### ## # # # # # ### # ## # ## ## ### # # # # # # # # # # ### ###
# # # # # # # # # # # # # # # # # ### # # # # # # # # # # # # # # # # # # # # # # # #
### ## # # # ## ## # # ### # # ## # ### # # # # ## # # ## # # # # # # ### # # # ##
# # # # # # # # # # # # # # # # # # # # # # # # # # ## # # # # # # # # ### # # # #
# # ## ## ## ### # ## # # ### # # # ### # # # # # # # # # ## # ### # # # # # # ### #
# # ## ## ## ### # ## # # ### # # # ### # # # # # # # # # ## # ### # # # # # # ### #
# # ## ## ## ### # ## # # ### # # # ### # # # # # # # # # ## # ### # # # # # # ### #
# # ## ## ## ### # ## # # ### # # # ### # # # # # # # # # ## # ### # # # # # # ### #
# # ## ## ## ### # ## # # ### # # # ### # # # # # # # # # ## # ### # # # # # # ### #
# # ## ## ## ### # ## # # ### # # # ### # # # # # # # # # ## # ### # # # # # # ### #
我希望将输入打印两次:
# ## ## ## ### ### ## # # ### ## # # # # # ### # ## # ## ## ### # # # # # # # # # # ### ###
# # # # # # # # # # # # # # # # # ### # # # # # # # # # # # # # # # # # # # # # # # #
### ## # # # ## ## # # ### # # ## # ### # # # # ## # # ## # # # # # # ### # # # ##
# # # # # # # # # # # # # # # # # # # # # # # # # # ## # # # # # # # # ### # # # #
# # ## ## ## ### # ## # # ### # # # ### # # # # # # # # # ## # ### # # # # # # ### #
# ## ## ## ### ### ## # # ### ## # # # # # ### # ## # ## ## ### # # # # # # # # # # ### ###
# # # # # # # # # # # # # # # # # ### # # # # # # # # # # # # # # # # # # # # # # # #
### ## # # # ## ## # # ### # # ## # ### # # # # ## # # ## # # # # # # ### # # # ##
# # # # # # # # # # # # # # # # # # # # # # # # # # ## # # # # # # # # ### # # # #
# # ## ## ## ### # ## # # ### # # # ### # # # # # # # # # ## # ### # # # # # # ### #
我应该如何操作Alphabet_input的索引以正确地将每一行打印为字符串?
我真的很困惑,因为在for循环中打印似乎可以正常工作。 但是在此之后,索引似乎崩溃了。
for (int i = 0; i < H; i++) {
char ROW[1025];
fgets(ROW, 1025, stdin);
alphabet_input[i] = ROW;
}
变量ROW
在for主体的范围内,因此将在每次迭代时创建和销毁它。 您将alphabet_input[i]
指向此变量,该变量会在迭代结束时立即销毁,因此最终会出现悬空指针。
您无需为alphabet[i]
指向局部变量,而需要为其分配空间,然后将行的内容复制到其中。
char ** alphabet_input;
alphabet_input = malloc(height * sizeof *alphabet_input);
for (int i = 0; i < height; i++) {
char row[1025];
fgets(row, 1025, stdin);
size_t len = strlen(row);
alphabet_input[i] = malloc(len + 1);
strcpy(alphabet_input[i], row);
}
您可能要根据所需的长度来调整上面的代码(例如,用1025代替strlen,或删除尾随的新行等)。
我想提出几点:
这就是我建议写malloc
:
pointer_var = <no cast> malloc(<num_elements> * sizeof *pointer_var); alphabet_input = malloc(height * sizeof *alphabet_input);
标准保证sizeof(char)
为1
,因此您可以在malloc
跳过sizeof(char)
:
alphabet_input[i] = malloc(len + 1);
避免所有大写变量。 它们通常用于C中的宏。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.