【问题标题】:Trouble with a C "for" Loop - Won't iterate past 1stC“for”循环的问题 - 不会迭代第一个
【发布时间】:2016-05-13 14:36:15
【问题描述】:

我正在解决 CS50 的问题,我必须根据用户输入的高度从# 中创建一个金字塔。这是我到目前为止所拥有的,但是对于 8 的高度,它只迭代一次。对于 7 的高度,我得到了大约四行只是乱七八糟的 #'s。

//Create GetPosInt() function
int GetPosInt(void) {
    int n = GetInt();
    while (n <= 0) {
        printf("That won't work...\nRetry: ");
        n = GetInt();
    }
    return n;
}

int main(void) {
    printf("How high should Mario's pyramid be?\nHeight: ");
    int h = GetPosInt();
    while (h > 23) {
        printf("Try something smaller!\nHeight: ");
        h = GetPosInt();
    } 
    char str[] = "##";
    char strad[] = "#";
    int l = h + 1;
    for (int i = 0; i < h; i++) {
        printf("%*s\n", l, str);
        strcat(str, strad);
        return 0;
    }
}

这是我第一次尝试使用 string.h 库。
请仅提供有关修复我的代码的提示-我确定还有其他方法可以解决,但是如果可以这样,我想在课堂上保留它!

【问题讨论】:

  • 看看循环里面的代码……你不做点什么把它里面结束吗?我想你会的。
  • char str[] = "##"; : 不存在可以连接字符串的额外空间。
  • 创建数组str 以包含三个 字符:两个'#' 字符和字符串终止符。附加到 this 会写出 out of bounds 并给你 undefined behavior
  • @AnishSharma 嗯,我很喜欢轻松获胜... ;)
  • @AnishSharma 好吧,正如 Joachim 所写:这是未定义的行为

标签: c loops for-loop cs50


【解决方案1】:

您的 str 数组/C-String 没有空间连接 2 个字符以外的其他字符。

你可以做一点改变:

char str[128] = "";
strcat(str, "##");

【讨论】:

  • 所以char str[] = "##" 只允许字符串有两个字符?我认为这是由 [] 中的内容指导的?
  • 您将其初始化为三个字符、两个哈希和一个 nul。
  • 没有为编译器定义特定的大小需求,以根据您编写的初始化程序为其提供正确的大小。在您的情况下,str 的大小将为 3:2 个哈希和 1 个空终止符。
  • 这个改变做到了。正如建议的那样,这是没有空间连接到 str 变量的问题。我错误地认为它会随着我连接它而增长。谢谢。
【解决方案2】:

您的return 0; 位于循环内,这就是为什么。编辑如下:

    for (int i = 0; i < h; i++) {
      printf("%*s\n", l, str);
      strcat(str, strad);
    }
    return 0;

【讨论】:

  • 试过了,但我仍然只能从不同的高度进行一次迭代。
【解决方案3】:

在 C 编程语言中,您必须自己管理内存。当您使用 strcat 时,这些内存分配不会扩大。相反,您将覆盖超出为 str 分配的内存的内存。我强烈建议您先介绍一下 C 编程以及如何手动管理内存。

【讨论】:

    【解决方案4】:

    你应该在循环之后返回。第一次迭代完成后,您将离开该函数。

    您还应该尝试将 str 定义为: 字符 * str; str = malloc(sizeof(char)* 2); str = strcat(str, "##");

    并将 strcat 用作:str = strcat(str,strad);

    【讨论】:

    • 改变了字符 str[] = "##"; to char * str = "##";和 char * str[] = "##";没有运气。
    • 如果你真的需要从这两个开始,你需要先分配内存,然后 strcat 这两个 ## 。尝试使用 Malloc() 函数来执行此操作。
    • 我现在在移动设备上,所以代码没有正确发布。我希望那不是问题。
    • 请注意,sizeof(char) 定义为 1。
    • 只是为了让事情更容易理解。不是幻数的忠实粉丝。
    猜你喜欢
    • 1970-01-01
    • 2010-12-28
    • 2021-08-18
    • 2012-01-05
    • 1970-01-01
    • 2015-11-13
    • 2019-10-03
    • 1970-01-01
    • 2019-10-04
    相关资源
    最近更新 更多