麻烦的C" for"循环 - 赢得了第一次迭代

时间:2016-05-13 14:36:15

标签: c loops for-loop cs50

我正在研究CS50的一个问题,我必须根据用户输入的高度在#中创建一个金字塔。这是我到目前为止所拥有的,但是对于8的高度,它只迭代一次。对于7的高度,我得到大约四行#&#39>。

//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库 请仅提供有关修复我的代码的提示 - 我确定还有其他相关方法,但如果可以这样做,我想在课堂上保留它!

4 个答案:

答案 0 :(得分:4)

你的str数组/ C-String没有空间连接其他字符而不是2个字符。

你可以做一点改变:

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

答案 1 :(得分:1)

你的return 0;在循环中,因此为什么。按原样编辑:

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

另外你应该尝试将str定义为:     char * str;     str = malloc(sizeof(char)* 2);     str = strcat(str,&#34; ##&#34;);

使用strcat as:str = strcat(str,strad);