2012-04-15 12 views
0

こんにちは、引数として文字列を参照する関数を使用するといくつかの問題があります。私はあなたがこれのために電子ダブルポインタを使用すべきであることを読んだが、私はそれを働かせることはできません。 これは私のコードです(部分的に)。ダブルポインタで文字列を参照して呼び出す

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¯ˇø. 

私は明らかに、入力された文字列の2番目の単語を持つようにしたいが、私は何か間違ったことをやっています。 Thxのヘルプ!

+0

AREN:その関数が(投稿コードには当てはまらない)引数に新しいバッファを割り当てる場合


ダブルポインタは、例えばchar**は、一般に関数に渡されます。コンパイラの警告が出ない? -Wallオプションでコンパイルし、警告メッセージの内容をお知らせください。 –

+0

それはコンパイルすべきではありません。 '&stringval2'は配列へのポインタであり、ポインタへのポインタではありません – newacct

答えて

2

stringVal2は初期化されていないため、決して入力されません。つまり、理由ジャンクが印刷されています。この場合、char**を渡す必要はありません。char*を渡すと動作します。しかし、この:

outputString = strTemp2; 

strTemp2outputStringの内容をコピーしません:strcpy()を使用します。それはstrTemp2と同じアドレスへoutputStringポイントになります。

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

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

thx!それは私にもっとはっきりと分かります。 – Tono

+0

問題はなく、オーバーフローをスタックすることを歓迎します。答えがあなたの問題を解決するならば、答えを受け入れることは普通です(答えの左側の白い刻みをクリックすることによって)。しかし、それがその質問に答えるとそれを受け入れるのが最良の答えです(だから誰かがもっと役に立つ答えを投稿するのを待つ価値があるかもしれません)。 – hmjd

+0

完了し、再度thxします。 – Tono

関連する問題