繁体   English   中英

字符双指针混淆行为

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM