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



我使用xCode,因为我发现调试器非常有用。所以在调试器中我看到,在我输入学生名之后name[0] = 无论什么。但是剩下的名字是正确的。例如,如果我输入John,它会返回,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;

这样做:

    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])的第一个元素的指针(有对该规则的期望,请参阅此处了解详细信息)。

您需要使用scanf("%s", name);而不是scanf("%s", &name); (department也是如此)。

scanf需要一个内存地址来写。在字符串的情况下,它期望char *和传递char[]在这种情况下是好的(它很容易缓冲区溢出!)。

然而,对于你的整数-这不是一个指针-你需要传递内存地址的整数,即&rank而不是rank -你已经做了。

scanf函数需要知道它需要读入的内存地址,所以对于整数

scanf("%d", &rank);

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

scanf("%s", &name);

你想:

scanf("%s", name);

当你声明一个数组时;

    char name[MAX_NAME_LENGTH];

没有索引的name是指向数组中第一个元素的指针。

name == &name[0]

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

scanf("%s", name);

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

当你试图传递变量的地址(&name)时,你是在传递一个指向该变量的内存位置的指针(在你的例子中,它衰减到char(*)[0])。这个问题引起了我的兴趣,因为name&name将具有相同的值,但不同的类型。由于printf/scanf被定义为接收char*,传递char(*)[]会导致未定义的行为——一些编译器会为你处理它,而另一些编译器不会(VS2010和更早的版本可能会为你处理这个)。

我很接近,但有一些帮助与这个答案(学到了很多):&c语言中数组的操作符定义。如果它们在这里提供了答案,我将删除我的。

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

避免使用&,太容易出错了。

相关内容

  • 没有找到相关文章

最新更新