gpt4 book ai didi

C 通用打印数组函数 - 打印字符串数组

转载 作者:行者123 更新时间:2023-11-30 15:00:54 26 4
gpt4 key购买 nike

我正在尝试用 C 语言编写一个通用的打印数组函数,但不知怎的,它不能很好地处理字符串数组。主要内容如下:

#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*)。或者,在更多 D.R.Y方式:

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 通用打印数组函数 - 打印字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41802339/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com