2013-02-22 56 views
1

夥計們,所以我正在處理Web服務分配和我有服務器dishing出隨機的東西,並閱讀uri,但現在我想讓服務器運行一個不同的功能取決於它在uri中讀取的內容。我明白,我們可以用函數指針來做到這一點,但我不確定如何讀取char *並將其分配給函數指針並使其調用該函數。 我想要做的例子:http://pastebin.com/FadCVH0h用戶輸入的字符串在c中運行一個特定的函數

我可以使用switch語句,我相信但是想知道是否有更好的方法。

回答

3

對於這樣的事情,你需要一個將char *字符串映射到函數指針的表。當你將函數指針指定給字符串時,程序會出現段錯誤,因爲從技術上講,函數指針不是字符串。

注意:以下程序僅用於演示目的。無邊界檢查涉及,它包含硬編碼值和魔法數字

現在:

void print1() 
{ 
    printf("here"); 
} 

void print2() 
{ 
    printf("Hello world"); 
} 
struct Table { 
    char ptr[100]; 
    void (*funcptr)(void) 
}table[100] = { 
{"here", print1}, 
{"hw", helloWorld} 
}; 

int main(int argc, char *argv[]) 
{ 
    int i = 0; 
    for(i = 0; i < 2; i++){ 
     if(!strcmp(argv[1],table[i].ptr) { table[i].funcptr(); return 0;} 
    } 
    return 0; 
} 
0

我會給你一個很簡單的例子,我認爲,是非常有用的瞭解有多好可以在C函數指針(例如,如果你想作一個shell)

例如,如果你有這樣的結構:

typedef struct s_function_pointer 
{ 
    char*  cmp_string; 
    int  (*function)(char* line); 
}    t_function_pointer; 

然後,您可以設置up一個t_function_pointer數組,您將瀏覽:

int  ls_function(char* line) 
{ 
     // do whatever you want with your ls function to parse line 
     return 0; 
} 

int  echo_function(char* line) 
{ 
     // do whatever you want with your echo function to parse line 
     return 0; 
} 

void treat_input(t_function_pointer* functions, char* line) 
{ 
     int counter; 
     int builtin_size; 

     builtin_size = 0; 
     counter = 0; 
     while (functions[counter].cmp_string != NULL) 
     { 
      builtin_size = strlen(functions[counter].cmp_string); 
      if (strncmp(functions[counter].cmp_string, line, builtin_size) == 0) 
      { 
        if (functions[counter].function(line + builtin_size) < 0) 
          printf("An error has occured\n"); 
      } 
      counter = counter + 1; 
     } 
} 

int  main(void) 
{ 
    t_function_pointer  functions[] = {{"ls", &ls_function}, 
              {"echo", &echo_function}, 
              {NULL, NULL}}; 
    // Of course i'm not gonna do the input treatment part, but just guess it was here, and you'd call treat_input with each line you receive. 
    treat_input(functions, "ls -laR"); 
    treat_input(functions, "echo helloworld"); 
    return 0; 
} 

希望這有助於!

相關問題