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'に嘘をつきました。そして、fyi、 'char * str =(char *)s;のキャストは必要ありません。 like-constの 'void * 'にキャストしたり、キャストしたりするのは自動です。 – WhozCraig
インデックス作成に正しいタイプの 'size_t'を使用しません。そして、あなたは何もしないで 'Worker * w =(Worker *)worker; =>' Worker * w = worker; ' – Stargateur
@Stargateur - コンパイラには関係ありません。 – LjTiNo