[英]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.