编写我的第一个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
没有&符号。 这是因为当在表达式中使用时,编译器隐式地将name
和department
转换为指向相应数组( &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);
您的变量name
和department
是字符数组( char (*)[]
)。 当您将这些变量传递给printf / scanf(或任何其他函数,数组通过引用传递)时,它们的类型会衰减为TYPE*
(在您的情况下为char*
),并作为数组中第一个元素的内存位置传递。
当您尝试传递varible( &name
)的地址时,您传递的指针指向该变量的内存位置(在您的情况下,这会衰减为char(*)[0]
)。 这个问题引起了我的兴趣,因为name
和&name
将具有相同的值,但是类型不同。 由于printf / scanf被定义为接收char*
,传递char(*)[]会导致未定义的行为 – 一些编译器会处理你是否有其他人不会(VS2010和可能早期的版本为你处理这个)。
我很接近,但对这个答案有所帮助(学到了很多): &C中数组的运算符定义 。 如果他们在这里提供答案,我会删除我的。
使用scanf("%s", name);
避免使用&,这很容易出错。