簡體   English   中英

C通用打印數組功能-打印字符串數組

[英]C Generic Print Array function - printing String Array

我正在嘗試用C語言編寫一個通用的打印數組函數,但它在某種程度上不能與String數組一起工作。 這是主要的:

#define LEN 20

typedef struct {
    char name[LEN]; // worker's name
    int salary; // worker's salary
    char **childArr; // array of children names
    int numChildren; // number of children
} Worker;

void printArray(void* arr, int size, int typeSize,  void (*print)(void*));
void printString(void* s);
void printWorker(void* worker);

void main() {
    // arrays of children's names
    char *chBamba[] = { "Bambale1", "Bamb2", "Bamb3", "Bambook4", "Bambookle5" };
    char *chBisli[] = { "Bislile1", "Bischick2", "Bislile3", "Bis4"};
    int nBamba = sizeof(chBamba) / sizeof(*chBamba);
    int nBisli = sizeof(chBisli) / sizeof(*chBisli);

    // array of workers
    Worker a[] = { {"Printf", 10, NULL, 0}, {"Bisli", 20, chBisli, nBisli},
{"TapooChips", 3, chBamba, nBamba}, {"Bamba", 19, chBamba, nBamba} };

    printArray(a, sizeof(a)/sizeof(Worker), sizeof(Worker), printWorker);

}

和功能:

void printArray(void* arr, int size, int typeSize,  void (*print)(void*)) {
    int i;
    for (i = 0; i < size; i++) {
        print((char*)arr+i *typeSize);
    }
    printf("\n");
}

void printString(void* s) {
    char* str = (char*)s;
    printf("[ %s ]", *str);
}

void printWorker(void* worker) {
    Worker* w = (Worker*)worker;
    printf("%s\t %d...(%d) ", w->name, w->salary, w->numChildren);
    if (w->numChildren != 0)
        printArray(w->childArr, w->numChildren, LEN, printString);

    printf("\n");
}

打印第二個工作程序的數據並轉到“ children”數組后,代碼將中斷...

知道為什么嗎? 我該如何解決?

編輯后: printArray(w->childArr,w->numChildren,sizeof(w->childArr[0]),printString);

這是: printf("[ %s ]",str);

我現在有以下打印: img1

這行在這里:

printArray(w->childArr,w->numChildren,LEN,printString);

您將LEN作為數組中元素的大小傳遞,它可能比數組元素的大小大得多。 這使printArray的循環超出了數組邊界,在數組邊界中,任何訪問都是未定義的行為。

您的數組包含指向字符串的指針。 您需要傳遞sizeof(char*) 或者,以更干燥的方式:

printArray(w->childArr, w->numChildren, sizeof w->childArr[0], printString);

您的printString函數執行錯誤的類型轉換。 您必須記住, printArray將指向當前元素的指針傳遞給回調。 由於您遍歷char*數組,因此它將傳遞char** 考慮到這一點:

void printString(void *vpStr) {
    char **pStr = vpStr;
    printf("[ %s ]", *pstr);
}

僅供參考,您所使用的方法是傳統上在C中完成的方式。但是在現代C中,您可以通過更好的方式編寫此類泛型函數:鍵入safe且不需要函數指針:

#include <stdio.h>
#include <string.h>

#define print_array(data, n)         \
  _Generic((*data),                  \
           int: print_int,           \
           char: print_char)(data,n) \


void print_int (const int* data, size_t n)
{
  for(size_t i=0; i<n; i++)
  {
    printf("%d ", data[i]);
  }
}

void print_char (const char* data, size_t n)
{
  for(size_t i=0; i<n; i++)
  {
    printf("%c ", data[i]);
  }
}



int main (void)
{
  int int_array [3] = {1, 2, 3};
  const char* char_array = "hello world";

  print_array(int_array, 3);
  printf("\n");
  print_array(char_array, strlen(char_array)); 
  printf("\n");

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM