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

入力された文字列の2番目の単語が必要なのは明らかですが、何か問題があります。助けてくれてありがとう!

4

1 に答える 1

2

stringVal2初期化されておらず、データが入力されることもありません。これが、ジャンクが印刷されている理由です。この場合、を渡す必要はありません。aを渡すchar**と機能しchar*ます。ただし、これは次のとおりです。

outputString = strTemp2;

strTemp2toのコンテンツをコピーしません:useと同じアドレスをポイントしoutputStringます。outputStringstrTemp2strcpy()


たとえば、ダブルポインタchar**は通常、関数が引数に新しいバッファを割り当てるときに渡されます(投稿されたコードには当てはまりません)。

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

void my_alloc(char** p)
{
    *p = malloc(10);
}
于 2012-04-15T21:51:38.340 に答える