编写我的第一个C程序,我无法通过这个愚蠢的错误

时间:2011-05-01 19:33:40

标签: c scanf

我正在使用xCode,因为我发现调试器非常有用。所以在我看到的调试器中,输入学生名称[0] = \ 0无论如何。但其余的名称将是正确的。例如,如果我放约翰,它会回来说\ 0,o,h,n。请帮忙吗?

        char name[MAX_NAME_LENGTH];
        char department[MAX_DEPT_LENGTH];
        int rank;
        int empty = 0;

        printf("\nPlease enter the students name: ");
        scanf("%s", &name);
        printf("\nPlease enter the students department: ");
        scanf("%s", &department);
        printf("\nPlease enter the students rank: ");
        scanf("%d", &rank);


        strcpy(studentArray[empty].name, name);
        strcpy(studentArray[empty].department, department);
        studentArray[empty].rank = rank;

6 个答案:

答案 0 :(得分:2)

这样做:

    printf("\nPlease enter the students name: ");
    scanf("%s", name);
    printf("\nPlease enter the students department: ");
    scanf("%s", department);
    printf("\nPlease enter the students rank: ");
    scanf("%d", &rank);

请注意前两次调用scanf时没有&符号。这是因为当在表达式中使用它们时,编译器隐式地将namedepartment转换为指向相应数组(&name[0]&department[0])的第一个元素的指针(那里)是对此规则的考虑,有关详细信息,请参阅here

阅读this以获取进一步的参考。

答案 1 :(得分:1)

您需要使用scanf("%s", name);代替scanf("%s", &name);department也一样)。

scanf需要写入的内存地址。如果是字符串,则需要char *,并且在这种情况下传递char[]很好(它很容易受到缓冲区溢出的影响!)。

但是,对于你的整数 - 不是指针 - 你需要传递整数的内存地址,即&rank而不是rank - 你已经那样。

答案 2 :(得分:0)

您的变量namedepartment是字符数组(char (*)[])。当您将这些变量传递给printf / scanf(或任何其他函数,数组通过引用传递)时,它们的类型会衰减到TYPE*(在您的情况下为char*)并作为内存位置传递给数组中的第一个元素。

当您尝试传递变量(&name)的地址时,您传递的指针指向该变量的内存位置(在您的情况下,这会衰减到char(*)[0])。这个问题引起了我的兴趣,因为name&name将具有相同的值,但类型不同。由于printf / scanf被定义为接收char*,因此传递char(*)[]会导致未定义的行为 - 某些编译器将处理您是否会处理其他编译器(VS2010以及可能是早期版本为您处理此问题)。

我很接近,但对这个答案有所帮助(了解了很多):& operator definition for arrays in C。如果他们在这里提供答案,我会删除我的。

答案 3 :(得分:0)

scanf函数需要知道它需要读入的内存中的地址,所以对于像整数这样的东西

scanf("%d", &rank);

是对的。但是像name这样的东西已经是地址(数组的名称实际上是它的第一个元素的地址)所以代替:

scanf("%s", &name);

你想要:

scanf("%s", name);

与其他阵列类似。

答案 4 :(得分:0)

声明数组时;

    char name[MAX_NAME_LENGTH];
没有索引的

name是指向数组中第一个元素的指针。

name == &name[0]

当函数(例如scanf())调用char *时,它需要指向第一个元素的指针。

scanf("%s", name);

答案 5 :(得分:-1)

使用scanf("%s", name);

避免使用&,这很容易出错。