这个节目应该画一个房子。但功能不起作用

时间:2014-03-03 17:24:24

标签: c cygwin

我正在尝试用C编写这个程序,用星星,短划线或点画出一个房子。它询问用户一组问题(大房子或小房子),(要使用什么字符?),(多少个窗户?)然后应该画出房子。我没有为无效响应添加任何代码,因为我想先检查它是否与有效响应有效,但事实并非如此。在第三个问题之后,Cygwin说“分段错误(Core Dumped)”。有人可以告诉我这是什么问题吗?

#include <stdio.h>
#include <math.h>
#define house 1

char qbs; // for quit big small
char dsd; // for dash star dot
int now; // number of windows
int i, f; // random variables for for loops


main()
{
while(house) {
printf("Do you want a big or small house? (Q: quit, B: big house, S: small house)\n");
scanf("%s", &qbs);
switch(qbs){
    case 'B': 
    case 'b': 
    case 's':
    case 'S': break;
    default : printf("%s is not a valid choice. Please try again.\n", qbs);
              continue;
    }

printf("Which characters do you want for drawing? (DASH(-), STAR(*), or DOT(.))\n");
scanf("%s", &dsd);
printf("Using %c to draw the house.\n", dsd);

printf("How many windows do you want in the house? (0 through 4 for big houses and 0 through 2 for small houses.)\n");
scanf("%d", &now);

switch(dsd){
        case '-': dsd='-';
                  break;

        case '*': dsd='*';
                  break;

        case '.': dsd='.';
                  break;
        }
printf("%c %c %d", qbs, dsd, now);

switch(qbs){
        case 'Q':
        case 'q': printf("QUITTING THE PROGRAM.\n"); break;

        case 'B':
        case 'b': printf("         "); // this line and the next 7 lines draw the BIG roof 
                  for(i=0; i<=42; i++) {printf("%s", dsd);}
                  printf("\n      ");
                  for(i=0; i<=48; i++) {printf("%s", dsd);}
                  printf("\n   ");
                  for(i=0; i<=56; i++) {printf("%s", dsd);}
                  printf("\n");
                  for(i=0; i<=62; i++) {printf("%s", dsd);}
                 switch(now) { 
                    case '0':
                        for(f=0; i<=15; f++) { // the vertical expansion
                            for(i=0; i<=62; i++) {printf("%s", dsd); printf("\n");} // the horizontal expansion
                        }
                        break;

                    case '1':
                        for(i=0; i<=62; i++) {printf("%s", dsd); printf("\n");} // first line with no windows
                        for(f=0; f<=13; f++) { 
                            for(i=0; i<=28; i++) { printf("%s", dsd); } // left side of window
                            for(i=0; i<=6; i++) { printf(" "); } // window
                            for(i=0; i<=28; i++) { printf("%s"); } // right side of window
                        }
                        for(f=0; f<=2; f++) { for(i=0; i<=62; i++) {printf("%s", dsd);}} // bottom two lines with no windows
                        break;

                    case '2': 
                        for(i=0; i<=62; i++) {printf("%s", dsd); printf("\n");} // first line with no windows
                        for(f=0; f<=13; f++) {
                            for(i=0; i<=21; i++) { printf("%s", dsd); } // left side
                            for(i=0; i<=7; i++) {printf(" ");} // first window
                            for(i=0; i<=6; i++) {printf("%s", dsd);} // space between windows
                            for(i=0; i<=7; i++) {printf(" ");} // second window
                            for(i=0; i<=21; i++) { printf("%s", dsd); } // right side
                        }
                        for(f=0; f<=2; f++) { for(i=0; i<=62; i++) {printf("%s", dsd);}} // bottom two lines with no windows
                        break;

                    case '3': 
                        for(i=0; i<=62; i++) {printf("%s", dsd); printf("\n");} // first line with no windows
                        for(f=0; f<=13; f++) {
                            for(i=0; i<=11; i++) { printf("%s", dsd);} // left side
                            for(i=0; i<=6; i++) {printf(" "); } // first window
                            for(i=0; i<=11; i++) { printf("%s", dsd);} // space between window 1 and 2
                            for(i=0; i<=6; i++) {printf(" "); } // second window
                            for(i=0; i<=11; i++) { printf("%s", dsd);} // space between window 2 and 3
                            for(i=0; i<=6; i++) {printf(" "); } // third window
                            for(i=0; i<=11; i++) { printf("%s", dsd);} // right side
                        }
                        for(f=0; f<=2; f++) { for(i=0; i<=62; i++) {printf("%s", dsd);}} // bottom two lines with no windows
                        break;

                    case '4': 
                        for(i=0; i<=62; i++) {printf("%s", dsd); printf("\n");} // first line with no windows
                        for(f=0; f<=13; f++) {
                            for(i=0; i<=6; i++) {printf("%s", dsd);} // left side
                            for(i=0; i<=8; i++) {printf(" ");} // first window
                            for(i=0; i<=6; i++) {printf("%s", dsd);} // space between win1 and win2
                            for(i=0; i<=8; i++) {printf(" ");} // second window
                            for(i=0; i<=6; i++) {printf("%s", dsd);} // space between win2 and win3
                            for(i=0; i<=8; i++) {printf(" ");} // third window
                            for(i=0; i<=6; i++) {printf("%s", dsd);} // space between win3 and win4
                            for(i=0; i<=8; i++) {printf(" ");} // fourth window
                            for(i=0; i<=6; i++) {printf("%s", dsd);} // right side
                        }
                        for(f=0; f<=2; f++) { for(i=0; i<=62; i++) {printf("%s", dsd);}} // bottom two lines with no windows


        case 'S':
        case 's': printf("         "); // this line and the next 7 lines draw the SMALL roof
                  for(i=0; i<=12; i++) {printf("%s", dsd);}
                  printf("\n      ");
                  for(i=0; i<=18; i++) {printf("%s", dsd);}
                  printf("\n   ");
                  for(i=0; i<=24; i++) {printf("%s", dsd);}
                  printf("\n");
                  for(i=0; i<=30; i++) {printf("%s", dsd);}
                  switch(now) { 
                    case '0':
                        for(f=0; i<=6; f++) { // the vertical expansion
                        for(i=0; i<=30; i++) {printf("%s", dsd); printf("\n");} // the horizontal expansion
                        }
                        break;

                    case '1':
                        for(f=0; f<=5; f++) { 
                        for(i=0; i<=12; i++) { printf("%s", dsd); } // left side of window
                        for(i=0; i<=6; i++) { printf(" "); } // window
                        for(i=0; i<=12; i++) { printf("%s"); } // right side of window
                        }
                    for(f=0; f<=1; f++) { for(i=0; i<=30; i++) {printf("%s", dsd);}} // bottom line with no windows
                    break;

                    case '2': 
                        for(f=0; f<=5; f++) {
                            for(i=0; i<=6; i++) { printf("%s", dsd); } // left side
                            for(i=0; i<=6; i++) {printf(" ");} // first window
                            for(i=0; i<=6; i++) {printf("%s", dsd);} // space between windows
                            for(i=0; i<=6; i++) {printf(" ");} // second window
                            for(i=0; i<=6; i++) { printf("%s", dsd); } // right side
                        }
                    for(f=0; f<=1; f++) { for(i=0; i<=62; i++) {printf("%s", dsd);}} // bottom line with no windows
                    break;
                  printf("Small house with %d windows\n", now);
                  break;
}
}
}
}

1 个答案:

答案 0 :(得分:1)

在整个代码中,尝试替换

printf("%s", dsd)

通过

printf("%c", dsd)

为您的scanf做同样的事情。你想要的是字符,而不是字符串。

无论如何这很有趣,前一天有人想画同一所房子,这对你的学习是一种锻炼吗? ^^