我试图从用户那里得到一些输入到这个函数的结构:
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()时发生运行时错误,我认为我在处理指针的方式上做错了。
答案 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);
。
干杯:)