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

我正在使用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; 

做这个:

  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); 

对于其他arrays也是如此。

声明数组时;

  char name[MAX_NAME_LENGTH]; 

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

 name == &name[0] 

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

 scanf("%s", name); 

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

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

我很接近,但对这个答案有所帮助(学到了很多): &C中数组的运算符定义 。 如果他们在这里提供答案,我会删除我的。

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

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