2014-02-19 63 views
0

我是C的新手。我想創建一個程序,用戶可以用數字填充數組,將特定數字設置爲某個數組寄存器或讀取寄存器的值。 除閱讀價值外,一切工作至今。我總是得到0回來,爲什麼? 這裏是我的代碼的getValue();爲什麼我的數組中的值不安全?

void getValues(int getArray[]){ 



fflush(stdin); 
printf("which slot do you want to read?\n"); 
gvinput = getchar(); 
ptr = getArray[gvinput]; 
printf("The value is: %d \n",ptr); 
start(); 
} 

,這裏是整個代碼..

#include <stdio.h> 
#include <stdlib.h> 


int* ptr; 
int list[200]; 
int x = 0; 
int i = 0; // variable used by for-Loop in setList 
int j = 0; // variable used by for-Loop in getList 
int c; // C used for new Game 
int input; 
int g1; //Value for getValue 
int option; //start Value 
int gvinput; 


int main() 
{ 
    start(); 
    return 0; 
} 


void setList(int sizeOfList) 
{ 
    for (i = x; i <= sizeOfList; i++) 
    { 

     list[i] = i; 

    } 
} 

void getList() 
{ 
    for(j = x; j < i ; j++) 
    { 
     printf("At %d we got the value %d with the adress %d\n",j,list[j],&list[j]); 
    } 
} 

void startList() 
{ 
    fflush(stdin); 
    printf("Please enter number between 0 and 30\n "); 
    scanf("%d",&input); 
    if(input > 30 || input == 0) 
    { 
     printf("The Number is not between 0 and 30\n"); 
     startList(); 
    } 
    setList(input); 
    getList(); 
    fflush(stdin); 
    start(); 
} 



void setValues(int l[]) 
{ 
    fflush(stdin); 
    int v; 
    int loc; 
    printf("please enter what value you want to safe\n"); 
    scanf("%d",&v); 
    fflush(stdin); 
    printf("Where do you want to save it?\n"); 
    scanf("%d",&loc); 
    l[loc] = v; 
    printf("we got at slot %d the value %d\nThe Adress is: %d.",loc,l[loc],&l[loc]); 
    start(); 
} 

void getValues(int getArray[]){ 



fflush(stdin); 
printf("which slot do you want to read?\n"); 
gvinput = getchar(); 
ptr = getArray[gvinput]; 
printf("The value is: %d \n",ptr); 
start(); 
} 

void start(){ 
    fflush(stdin); 
    printf("[L] = generate Slots\n"); 
    printf("[S] = set a Value at specific slot\n"); 
    printf("[G] = get a Value from a specific slot\n"); 
    option=getchar(); 
    if(option == 'L'){ 
     startList(); 
    } 
    if(option == 'S'){ 
     setValues(list); 
    } 
    if (option =='G'){ 
     getValues(list); 
    } 
} 

將是巨大的,如果有人可以幫助並給出提示

+0

'的printf( 「的值是:%d \ n」,* PTR);' – moeCake

+0

fflush(標準輸入) - >未定義的行爲 –

+1

@KaustavRay:不在Linux上;不在Windows上。 –

回答

1

您的程序通過使用getchar()得到徹底混淆。當你按鍵如G輸入,有兩個字符從getchar()返回。第一個電話將返回'G',然後下一次您撥打getchar()它將返回'\n'(回車鍵)。

爲了解決這個問題,以取代調用getchar()代碼,如:

char buf[80]; 
fgets(buf, sizeof(buf), stdin); 
option = buf[0]; 

fgets()的通話將獲得文本包括輸入按鍵的整條生產線,然後option = buf[0];提取輸入的第一個字符在線上。

這樣做後,您可以刪除技術上(根據C標準)未定義的行爲,並沒有真正做你想做的所有fflush(stdin)

編輯:你也會想要你的電話scanf()。該功能並非真正用於交互式使用。如上所述使用fgets(),然後撥打atoi()將輸入的字符串轉換爲int。

ANOTHER編輯:您正在使用

gvinput = getchar(); 

其分配ASCII值輸入到gvinput字符。如果輸入4,則gvinput將得到52,而不是4.使用您在setValues()中使用的相同方法獲得值loc

+0

請注意關於'fflush(stdin) –

+0

這是真的,但它仍然是*技術上*未定義的行爲 –

+0

它取決於什麼在做定義如果你爲你正在使用的系統的手冊和系統碰巧是Windows或Linux,那麼行爲是由實現定義的,而不是由標準定義的你說'C標準說'fflush(stdin)'是未定義的行爲',那麼你在安全的領域 - 它確實是這樣做的。 –

0
void getValues(int getArray[]){ 
fflush(stdin); 

printf("which slot do you want to read?\n"); 
scanf("%d",&gvinput); 
fflush(stdin); 
printf("The value is: %d \n",getArray[gvinput]); 
start(); 
} 

這是正確的代碼,以防萬一

相關問題