有人可以解释这个魔法吗?(scanf,结构,指针)c ++

时间:2015-11-28 23:21:59

标签: c++

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?

3 个答案:

答案 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*代表%dint代表`char,),更像是:

%c

答案 2 :(得分:0)

代码永远不会为persona中的指针指向的字段分配内存。在任何这些字段上调用scanf的程序具有未定义的行为。在其中一个对象上调用init没有用,因为它为这些字段分配了只读字符串数组;在完成之后调用scanf也会产生未定义的行为。