2012-04-15 97 views
0

嗨,大家好我有一些使用一個函數引用一個字符串作爲參數的問題。我讀過你應該使用e雙指針來做這件事,但我無法讓它工作。 這是(部分)我的代碼。通過引用調用一個雙字符串的字符串

enum errCode { ERR_NONE = 0, ERR_EMPTY, ERR_FULL, ERR_MEM, ERR_INIT, ERR_COMMAND, ERR_UNDEFINED }; 
typedef enum errCode ErrCode; 

typedef enum { 
    no = 0, add, del, src, show, exit 
} Command; 

int main(void) { 
    char stringval[50]; 
    char stringval2[50]; 
    ErrCode err; 
    Command currentCommand = no; 

    printf("Enter a command\n"); 

    if (fgets(stringval, 50, stdin) != NULL) { 
     char *p; 
     if ((p = strchr(stringval, '\n')) != NULL) 
      *p = '\0'; 
    } 

    ErrHandler(
      extractCommand(&currentCommand, stringval, &stringval2) 
      ); 

    printf("stringval 2 = %s.\n", stringval2); 

    return 0; 
} 

ErrCode extractCommand(Command *command, char *inputString, char **outputString) { 

    char *strTemp; 
    char *strTemp2; 

    //Get the first word of the string 
    strTemp = strtok(inputString, " "); 

    strTemp2 = strtok(NULL, " "); 
    *outputString = strTemp2; 

    //Check if it equals a command 
    if (strcmp(strTemp, "exit") == 0) { 
     *command = exit; 
     return ERR_NONE; 
    } else if (strcmp(strTemp, "add") == 0) { 
     *command = add; 
     return ERR_NONE; 
    } else if (strcmp(strTemp, "del") == 0) { 
     *command = del; 
     return ERR_NONE; 
    } else if (strcmp(strTemp, "src") == 0) { 
     *command = src; 
     return ERR_NONE; 
    } else if (strcmp(strTemp, "show") == 0) { 
     *command = show; 
     return ERR_NONE; 
    } else { 
     *command = no; 
     printf("%s", strTemp); 
     return ERR_COMMAND; 
    } 
} 

這是我的輸出是什麼樣子:

Enter a command 
add this is a test 
stringval 2 = z˜ˇøÀo‡èK‡èT¯ˇø. 

我顯然希望有輸入字符串的第二個字,但我做錯了什麼。 Thx求救!

+0

AREN你沒有得到任何編譯器警告?嘗試使用-Wall選項編譯並讓我們知道警告消息是什麼。 – 2012-04-15 21:47:47

+0

這甚至不應該編譯。 '&stringval2'是一個指向數組的指針,而不是指向指針的指針 – newacct 2012-04-16 00:27:16

回答

2

stringVal2沒有初始化,也沒有填充:這是原因垃圾正在打印。在這種情況下不需要通過char**,通過char*就可以工作。然而,這樣的:

outputString = strTemp2; 

不復制的strTemp2outputString內容:它使outputString指向同一個地址爲strTemp2:使用strcpy()


甲雙指針,char**例如,通常傳遞給功能時函數分配對於參數一個新的緩衝液(其不是在貼碼的情況下):

char* buf = NULL; 
my_alloc(&buf); 

void my_alloc(char** p) 
{ 
    *p = malloc(10); 
} 
+0

thx!這讓我更加清楚。 – Tono 2012-04-15 22:06:06

+0

沒問題,並歡迎堆棧溢出。只需指出,如果答案解決了您的問題,則接受答案是正常的(通過單擊答案左側的白色勾號)。但只有接受它,如果它回答了這個問題,並且是最好的答案(因此可能值得等待查看是否有其他人發佈了更有用的答案)。 – hmjd 2012-04-15 22:12:13

+0

完成,thx再次。 – Tono 2012-04-16 16:34:41