2013-05-10 174 views
1
#include <stdio.h> 
#include <string.h> 
void F1(void *comp, void *record){ 
    int complen = strlen((char *)comp), recordlen = *(int *)record; 
    *(int *)record = complen>recordlen ? complen : recordlen; 
} 

void F2(void *comp, void *ans){ 
    if(!*(char **)ans) 
     *(char **)ans = (char *)comp; 
    else if(strcmp((char *)comp, *(char **)ans) < 0) 
     *(char **)ans = (char *)comp; 
} 


void ProcessStrings(char ***vals, void* (*fp)(char *, void *), void *champ){ 
    char **copy = *vals; 
    while(*copy){ 
     fp(*copy++, champ); 
    } 
} 

int main() { 
    char *strings1[][100] = {{"beta", "alpha", "gamma", "delta", NULL}, {"Johnson", "Smith", "Smithson", "Zimmerman", "Jones", NULL}, {"Mary", "Bill", "Bob", "Zoe", "Annabelle", "Bobby", "Anna", NULL}}; 
    int maxLen = 0; 
    char *minString = NULL; 
    ProcessStrings(strings1, F1, &maxLen); 
    ProcessStrings(strings1, F2, &minString); 
    printf("Strings1: Max length is %d and min is %s\n", maxLen, minString); 
} 

快速背景...函数F1将字符串列表的最大长度提供给它的第二个参数。 F2按ASCII值提供最小字符串。指针指针

我的错误消息指出我传递了不兼容的指针类型来处理字符串。当我画出指针时,我感觉好像我不是。帮帮我?

回答

0

确实传递了不兼容的指针类型。

strings1是指向字符的二维数组指针。请注意,C中的二维数组元素按行连续排列,而函数期望在ProcessStrings内的strings1首次解除引用后看到指针。

如果要在代码正确地工作,就需要或者通过下面的结构来ProcessStrings

char **strings2[] = { 
     strings1[0], 
     strings1[1], 
     strings2[2] 
    }; 

或改变的功能的指针合作,以100个char指针的数组:

void ProcessStrings2(char * (*vals)[100], void (*fp)(void *, void *), void *champ){ 

顺便说一句,你的函数似乎只处理字符串的第一行。