繁体   English   中英

打印一个完美的正方形

[英]Print a perfect square

我有一个任务是根据两个输入打印一个完美的正方形,其中一个应该是行,另一个应该是列。 例子:如果输入是(5,3)它应该打印出这个

o---o
|   |
o---o

我有这段代码可以完成这项工作,直到我最后一次测试输入似乎为空[]并且我收到错误SIGSEGV (signal 11)

代码是

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
    char *array;
    size_t used;
    size_t size;
} StringArray;
void initArray(StringArray *a, size_t initialSize) {
    a->array = malloc(initialSize * sizeof(char));
    a->used = 0;
    a->size = initialSize;
}
void insertArray(StringArray *a, char element) {
    if (a->used == a->size) {
        a->size *= 2; // if reach limit duplicate size and alloc in the heap
        a->array = realloc(a->array, a->size * sizeof(char));
    }
    a->array[a->used++] = element;
}
void clearArray(StringArray *a, size_t newSize) {
    a->array = NULL;
    a->used = 0;
    a->array = realloc(a->array, newSize * sizeof(char));
    a->size = newSize;
}
void freeArray(StringArray *a) {
    free(a->array);
    a->array = NULL;
    a->used = a->size = 0;
}
void printLineX( int x,  StringArray line){
    for (int i = 0; i < x; i++) {
        if(i == 0  ||  i == x-1)insertArray(&line, 'o');
        else insertArray(&line, '-');
    }
    printf("%s\n", line.array);
   //
}
void printLineY(int x,  StringArray line){
    for (int i = 0; i < x; i++) {
        if(( i == 0) || ( i == x-1))insertArray(&line, '|');
        else insertArray(&line, ' ');
    }
   printf("%s\n", line.array);
   // freeArray(&line);
}
int main(int argc, char **argv) {
    // remove 1 from each dimension to offset for first char
    int x;
    int y;
    if(argc < 3) {
         x = atoi(argv[1]);
         y = 1;
    }
    else if (argc < 2){
        x = 1;
        y = 1;
    }   
    else{
        x = atoi(argv[1]);
        y = atoi(argv[2]);
    }
    if (x < 1) x = 0;
    if (y < 1) y = 0;
    StringArray line;
    initArray(&line, x);
  
  if(argc > 2)
   for (int i = 0; i < y; i++) {
      if(i == 0 || i == y -1) printLineX( x, line);
     else printLineY( x, line);
     clearArray(&line, x);
    }
    freeArray(&line);
    return 0;
}
    if(argc < 3) {
         x = atoi(argv[1]);
         y = 1;
    }
    else if (argc < 2){
        x = 1;
        y = 1;
    }   

这部分是错误的。 argc为 1 时, argc < 3为真,因此该代码可以访问argv[1] ,即使它为空。

它应该是:

    if (argc < 2){
        x = 1;
        y = 1;
    }
    else if(argc < 3) {
        x = atoi(argv[1]);
        y = 1;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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