struct persoana{
char *numePrenume;
char *strada, *oras, *judet;
int varsta;
};
void citire(struct persoana *p)
{
printf("NUME si PRENUME:");
scanf(" %[^\n]s", &p->numePrenume);
printf("STRADA:");
scanf(" %[^\n]s", &p->strada);
printf("JUDET:");
scanf(" %[^\n]s", &p->judet);
printf("ORAS:");
scanf(" %[^\n]s", &p->oras);
printf("VARSTA:");
scanf(" %[^\n]s", &p->varsta);
}
void init(struct persoana *p)
{
p->numePrenume = "ham";
p->strada = "ham";
p->judet = "ham";
p->oras = "ham";
p->varsta = 1;
}
void afis(struct persoana *p)
{
printf("%s\n", &p->numePrenume);
printf("%s\n", &(p->strada));
printf("%s\n", &(p->judet));
printf("%s\n", &(p->oras));
printf("%s\n", &(p->varsta));
}
我真的不明白它与scanf或printf有什么关系,或者是>,& ??? 有人可以解释this*,为什么会发生这种情况?是因为scanf?还是因为我没有分配内存?还是wtf?
答案 0 :(得分:1)
以下是可以使用的最低限度修改版本的代码。它不是最好的解决方案,它更像是在C中完成的。有评论说明了变化。
#include <stdio.h>
#include <string.h>
struct persoana{
// Declare members as char arrays (beware of the fixed size)
// If declared as pointers, they have to be malloc'ated, maybe in the init function.
char numePrenume[50];
char strada[50], oras[50], judet[50];
int varsta;
};
void citire(struct persoana *p)
{
// For the variables of type array or pointer, they already represent
// an address so "&" should not be used
printf("NUME si PRENUME:");
scanf(" %[^\n]s", p->numePrenume);
printf("STRADA:");
scanf(" %[^\n]s", p->strada);
printf("JUDET:");
scanf(" %[^\n]s", p->judet);
printf("ORAS:");
scanf(" %[^\n]s", p->oras);
printf("VARSTA:");
// %d used for int type, & needed here
scanf(" %d", &p->varsta);
}
void init(struct persoana *p)
{
// Original pointer initialization in your code was done using the addresses
// of string literals "ham". Using that, a write attempt afterwards to the
// dereferenced data would cause undefined behaviour or crash.
// Now, having arrays, that initialization is no more permitted,
// so strcpy is used to copy data
strcpy(p->numePrenume, "ham");
strcpy(p->numePrenume, "ham");
strcpy(p->strada, "ham");
strcpy(p->judet, "ham");
strcpy(p->oras, "ham");
p->varsta = 1;
}
void afis(struct persoana *p)
{
printf("%s\n", p->numePrenume);
printf("%s\n", p->strada);
printf("%s\n", p->judet);
printf("%s\n", p->oras);
printf("%d\n", p->varsta);
}
int main()
{
struct persoana p;
init(&p);
afis(&p);
citire(&p);
afis(&p);
return 0;
}
答案 1 :(得分:0)
您scanf
到内存位置,您printf
一个值并告诉它它是什么类型的值(例如 %s
{{1} },char*
代表%d
,int
代表`char,等),更像是:
%c
答案 2 :(得分:0)
代码永远不会为persona
中的指针指向的字段分配内存。在任何这些字段上调用scanf
的程序具有未定义的行为。在其中一个对象上调用init
没有用,因为它为这些字段分配了只读字符串数组;在完成之后调用scanf
也会产生未定义的行为。