簡體   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