我想在C中寫一個通用的打印數組函數,並以某種方式它不能很好地處理字符串數組。 這裏的主: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");
}
打印第二工人的數據和去「孩子」陣列,代碼休息後...
任何想法爲什麼?我該如何解決它?
編輯此之後:printArray(w->childArr,w->numChildren,sizeof(w->childArr[0]),printString);
這個:printf("[ %s ]",str);
我現在有以下打印: img1
好,'的printf(「[%s]的」,* STR);'肯定是不好,和你的編譯器應該扔了一個大胖子警告信息,告訴你。 'str'是'char *',所以'* str'是'char',這對'%s'來說並不好。基本上,當你承諾給它一個指向char的指針並給它指定char時,你就騙過了'printf'。而且,不需要'char * str =(char *)s;'中的強制轉換。在C中轉換或從類似const的'void *'是自動的。 – WhozCraig
您不使用正確的類型'size_t'進行索引。並且你什麼也不施展,「Worker * w =(Worker *)worker;'=>'Worker * w = worker;' – Stargateur
@Stargateur - 編譯器無關緊要。 – LjTiNo