我正在使用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;
答案 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
时没有&符号。这是因为当在表达式中使用它们时,编译器隐式地将name
和department
转换为指向相应数组(&name[0]
,&department[0]
)的第一个元素的指针(那里)是对此规则的考虑,有关详细信息,请参阅here。
阅读this以获取进一步的参考。
答案 1 :(得分:1)
您需要使用scanf("%s", name);
代替scanf("%s", &name);
(department
也一样)。
scanf
需要写入的内存地址。如果是字符串,则需要char *
,并且在这种情况下传递char[]
很好(它很容易受到缓冲区溢出的影响!)。
但是,对于你的整数 - 不是指针 - 你需要传递整数的内存地址,即&rank
而不是rank
- 你已经那样。
答案 2 :(得分:0)
您的变量name
和department
是字符数组(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);
避免使用&,这很容易出错。