2016-09-09 4 views
0

私のプログラムからユーザー入力を受け取り、それを関数AddNumberに渡す方法を理解できない。プログラムが起動し、ユーザーの入力を求めて入力配列に格納しますが、配列から情報を取り出して関数AddNumberに渡す方法がわかりません。AddNumber関数の問題

私は「AddNumber」関数が何もしないことを理解しているので、コードを更新しました。私は、前のポインタが 'previous'であるという印を作成していましたか?

#include "stdio.h" 
#include "string.h" 
#include "stdlib.h" 

typedef struct A_NewNumber { 
    struct A_NewNumber *next; 
    char newNum; 
} NewNumber; 

NewNumber *AddNumber(NewNumber *previous, char *input){ 

//char input[16]; 
//double numEntered = 0; 

NewNumber *newNum = malloc(sizeof(NewNumber)); 
sscanf(input, "%lf", &newNum->newNum); 

//sscanf(input, "%s", newNum->enterNumber); 
//numEntered = atof(input); 
//possible code 
/*if (previous != NULL){ 
    previous->newNum; 
} 
newNum->next = NULL; 
newNum->newNum = 0; 
return newNum; 

}*/ 


void PrintList(NewNumber *numStart) { 
    NewNumber *currentNumber = numStart; 
    int count = 0; 

    while (currentNumber != NULL) { 
    count++; 
    printf("Number Position:%s\n", currentNumber->enterNumber); 
    currentNumber = currentNumber->next; 
    } 
    printf("Total Numbers Entered%d\n", count); 
} 

void CleanUp(NewNumber *start) { 
    NewNumber *freeMe = start; 
    NewNumber *holdMe = NULL; 

    while (freeMe != NULL) { 
    holdMe = freeMe->next; 
    free(freeMe); 
    freeMe = holdMe; 
    } 
} 

int main(){ 

    //indexNum = 0; 
    char command[16]; 
    char input[16]; 
    //float userInput; 
    NewNumber *userEnter = NULL; 
    NewNumber *start = NULL; 
    NewNumber *newest = NULL; 

    while(fgets(input, sizeof input, stdin)){ 
    printf("Please enter a number->"); 
    printf("Enter 'quit' to stop or 'print' to print/calculate"); 
    sscanf(input, "%s", command); 
    if(newest == NULL){ 
     start = AddNumber(NULL, input); 
     newest = start; 
    }else{ 
     newest = AddNumber(newest, input); 
    } 
    if(strncmp(command, "print", 5) == 0){ 
     PrintList(start); 
    }else if(strncmp(command, "quit", 4)== 0){ 
     printf("\n\nQuitting....\n"); 
     break; 
     //userInput = enterNumber; 
    } 
    } 
    CleanUp(start); 
    return 0; 
} 
+0

を機能させるあなたは直接 ')(' sscanf関数からの戻り値をチェックする必要があります。変換が成功したかどうかを教えてくれます。 '' strncmp() '呼び出しは' printer'を意味し、 'かなり'は 'print'と' quit'と同じ扱いになります。 –

+0

マイナーな問題:15または16-1のような "one-less"は 'fgets(input、15、stdin)'では不要で、 'fgets(input、sizeof input、stdin) 'のように16を使うことに注意してください。 – chux

答えて

0

コードをあまり変更しないで、AddNumberは前のNewNumberとユーザー入力を指すポインタを使用することをお勧めします。あなたの意向はdoubleでも読み取れるように思われるので、newNumフィールドをdoubleに変更します。このような何か:あなたはいくつかのproblmes

if(newest == NULL){ 
    start = AddNumber(NULL, input); 
    newest = start; 
} else { 
    newest = AddNumber(newest, input); 
} 
-1

通常、ほとんどのプログラミング言語でユーザー入力を得るための組み込みの方法があります。たとえば、Javaでは、Scannerオブジェクトを使用して、コマンドラインからのユーザー入力を促すことができます。これはコマンドラインアプリケーションですか?私はscanfの()関数を使用することをお勧めしますので

この

はCで、ここではそれは https://en.wikibooks.org/wiki/C_Programming/Simple_input_and_output#Input_using_scanf.28.29

あなただけの(つまり、%sの文字列)のデータ型を提供する必要が

とどのように動作するかの短い抜粋ですメモリアドレス。これはポインタを介して保存することができ、あなたはそれをあなたのAddNumber()関数に渡すことができます。

希望すると便利です。

+0

だからsscanf()関数では、sscanf(input、%s、&enterNumber)のようなものを言うことができます。 ? –

0

ようAddNumber関数を呼び出すとき

typedef struct A_NewNumber{ 
    struct A_NewNumber *next; 
    double newNum; 
} NewNumber; 

NewNumber *AddNumber(NewNumber *previous, char *input){ 

    NewNumber *newNum = malloc(sizeof(NewNumber)); 
    /* use %lf to read in a double */ 
    sscanf(input, "%lf", &newNum->newNum); 

    if (previous != NULL){ 
     previous->next = newNum; 
    } 

    return newNum; 
} 

は、その後、あなたは以前と入力を渡すことができます。

コードは効果がありません

if (previous != NULL){ 
    // Following line does no assignment 
    previous->newNum; 
} 

割り当て後、すべてのフィールドは必ず

に設定する必要があります
NewNumber *newNum = malloc(sizeof(NewNumber)); 
sscanf(input, "%s", newNum->enterNumber); 

// add 
newNum->next = NULL; 
newNum->newNum = 0; // TBD code, but set to something 

が間違ったポインタ型

NewNumber *AddNumber(NewNumber *previous){ 
.... 
char input[16]; 
.... 
start = AddNumber(input); 
+0

私はコードを更新しましたが、これはいくつかの問題を修正しましたか? –