以下功能aquire_marks
旨在获取5个用户输入的数字,并将其存储在marks
.运行时,for循环按预期运行一次j=0
,然后按预期运行j=1
,但随后j
不会递增到2
,并保持不变1
,使函数处于无限循环中.如果将循环置于内部main
,则不会发生此问题,但如果可能的话,我宁愿将其放在单独的函数中.有什么想法在这里发生了什么?
#include<stdio.h>
void aquire_marks(char marks[], char names[][11]){ // 11 - max name length + 1
char j, mark;
for(j=0; j<5; j++){
printf("Enter mark for %s: ", names[j]);
scanf("%d", &mark);
}
}
int main() {
char names[5][11] = {"a", "b", "c", "d", "e"};
char marks[5];
aquire_marks(marks, names);
}
Run Code Online (Sandbox Code Playgroud)
你已经声明mark
为a char
,但是在scanf
调用中你正在使用d
转换说明符,它希望它的相应参数有类型int *
,而不是char *
.使用错误的转换说明符会导致未定义的行为.
我将推测它mark
并且j
在内存中相邻,并且在读取整数值mark
(可能在2到4个字节宽的范围内)的过程中,值j
被覆盖.
被mark
认为代表一个数值(90
,75
,等)?如果是的话,改变的类型,mark
从char
到int
.
如果mark
应该代表一个字母等级(A
,B
,等),然后更改scanf
呼叫
scanf( " %c", &mark ); // note leading whitespace
Run Code Online (Sandbox Code Playgroud)