为什么我的Array中的值不安全?

时间:2014-02-19 01:24:50

标签: c arrays

我是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);
     }
}
如果有人可以提供帮助并给出提示,

会很棒

2 个答案:

答案 0 :(得分:1)

使用getchar()使您的程序彻底混淆。当您按下 G Enter 等键时,会从getchar()返回两个字符。第一个电话会返回'G',然后您下次拨打getchar()时,会返回'\n'(输入密钥)。

要解决此问题,请使用以下代码替换对getchar()的调用:

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

fgets()的调用将获得整行文本,包括 Enter 按键,然后option = buf[0];提取该行上键入的第一个字符。

执行此操作后,您可以删除技术上(根据C标准)未定义行为的所有fflush(stdin),并且不会真正执行您想要的操作。

编辑:您也希望对scanf()的来电也这样做。该功能根本不适合交互式使用。如上所述使用fgets(),然后调用atoi()将输入的字符串转换为int。

另一个编辑:您正在使用

gvinput = getchar();

指定键入gvinput的字符的 ASCII值。如果您输入4,则gvinput将获得52,而不是4.使用您在setValues()中使用的相同方法获取loc的值。

答案 1 :(得分: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();
}

这是正确的代码以防万一