该程序一次又一次地要求输入宽度?怎么办? C语言新手

时间:2015-09-14 19:21:58

标签: c cs50

程序一次又一次地要求输入宽度?怎么办? C语言新手。当我进入它时不断询问("输入宽度")它一次又一次地问。

代码清单

#include<cs50.h>
#include <stdio.h>
#include <stdbool.h>

int main (void)
{
    int height = 10;
    int width = 10;
    int width_Asterix = 2;

    printf("Enter the Height:");
    height = GetInt();

    for (int i = 0; i<height; i++)
    {
        printf("Enter the width: ");
        width = GetInt();

        for (int j = width ;j>0; j--)
        {
            printf(" ");
        }

        width--;
        for (int k = 0; k<width_Asterix; k++)
        {
            printf("*");
        }

        width_Asterix +=2 ;
        printf("\n");
    }
    return 0;
}

2 个答案:

答案 0 :(得分:1)

如果没有您告诉我们有关您的计划的更多信息,您似乎正在尝试打印ASCII art金字塔(a common problem in introductory C courses)。你有&#34;得到宽度&#34;循环中的代码,因此它被执行多次。您可能只想要一次请求值,因此您需要将该代码块移到for循环之外。更正后的代码包含在下面。

另外,如果可能的话,尽量避免使用那个已知的CS50库:它是一个创可贴,可以阻止你学习C语言的所有复杂,美丽的荣耀。

最后,请写一本关于C的好书。C Primer Plus by Steve Prata是我在本网站上提到的介绍文本and it's literally pennies to purchase a copy中的非官方黄金标准。在第一章的其中一章中,这是练习之一。

更新代码清单

/*******************************************************************************
 * Pre-processor Directives
 ******************************************************************************/
#include <stdio.h>
#include <stdbool.h>

#define BUF_LEN (256)


/*******************************************************************************
 * Function prototypes
 ******************************************************************************/
bool getBuf(char* buf);


/*******************************************************************************
 * Function definitions
 ******************************************************************************/
/*----------------------------------------------------------------------------*/
int main (void)
{
    char buf[256] = { 0 };
    int height = 10;
    int width = 10;
    int width_Asterix = 2;
    int i, j, k;

    printf("Enter the Height:");
    if ( !getBuf(buf) ) { return -1; }
    height = atoi(buf);

    printf("Enter the width: ");
    if ( !getBuf(buf) ) { return -1; }
    width = atoi(buf);

    for ( i = 0; i < height; i++ )
    {
        for ( j = width; j > 0; j-- )
        {
            printf(" ");
        }

        width--;

        for ( k = 0; k < width_Asterix; k++ )
        {
            printf("*");
        }

        width_Asterix +=2 ;
        printf("\n");
    }
    return 0;
}

/*----------------------------------------------------------------------------*/
bool getBuf(char* buf)
{
    if (!buf)
    {
        printf("Bad input.\n");
        return false;
    }
    fgets(buf, BUF_LEN, stdin); // Get a string of data
    strtok(buf, "\n");      // Clear out trailing newline
    return true;
}

示例输出

Enter the Height:5
Enter the width: 4
    **
   ****
  ******
 ********
**********

答案 1 :(得分:0)

我认为你应该把这个:

printf("Enter the width: ");
width = GetInt();

在for循环之外,在

之间
height = GetInt();

for (int i = 0; i<height; i++)

这样只需要一次(在循环之外)。