使用指针在结构中输入

时间:2013-12-29 13:29:31

标签: c pointers input struct

我试图从用户那里得到一些输入到这个函数的结构:

void adding(){
    Item *x = malloc(sizeof(Item));
    printf("Enter an integer.");
    scanf("%d", (x->any));
    printf("Enter a string.");
    scanf("%s", (x->text));
    printf("Which set would you like to add the Item to A/B?");
    while((scanf("%c", inp)) != ("A"||"B")){
        printf("Set does not exist\n");
    }
        if(A == inp)
            add(A, *x);
        else
            add(B, *x);

}

Item结构如下:

typedef struct anything{
    char text[MAXI];
    int any;
}Item;

最后调用的add函数就是这个:

void add(Array *S,Item *x){
    bool rep = false;
    int i = 0;
    for(i = 0; i<(S->size); i++){
        if(compStructs(x,S->arr+i))
            rep = true;
    }
    if(rep == false){
            Item *p2 = realloc(S->arr, (S->size+1)*sizeof(Item));
            *p2 = *x;
            (S->size)++;
    }
    else
        printf("The item is already in the set.");

}

由于在遇到第一个scanf()时发生运行时错误,我认为我在处理指针的方式上做错了。

2 个答案:

答案 0 :(得分:2)

编译所有警告和调试信息(例如gcc -Wall -g)。学习使用调试器(例如gdb)。

然后,您应该使用scanf(3)的结果。它给出了真正读取的项目数。

while((scanf("%c", inp)) != ("A"||"B"))非常错误。我确定编译器会警告你!

应该是

char inp = 0;
while (((inp=0),scanf(" %c", inp) == 1) && inp !=  'A' && inp != 'B')

答案 1 :(得分:1)

第一个scanf应该给出运行时错误。 scanf需要一个变量的位置,其中将放置从用户读取的值。

而不是scanf("%d", (x->any));你应该写scanf("%d", &(x->any));

因为当您通过malloc分配内存时,所有字节都将被赋值为value = 0。

所以基本上通过编写scanf("%d", (x->any));,你说的是从用户读取值到内存位置0.这是错误。

我在您的代码中发现的另一个错误是当您调用add()函数时。

它期望Item *作为第二个参数。当您通过add(A, *x);add(B, *x);致电时,您正在通过Item而不是Item *。 bcz x本身是Item *类型变量。所以你应该像这样称呼add(A, x);

干杯:)