C 循环计数器不递增

C 循环计数器不递增,c,arrays,loops,C,Arrays,Loops,下面的函数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 - m

下面的函数
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);
}
#包括
void-aquire_标记(字符标记[],字符名称[][11]){//11-最大名称长度+1
charj,mark;

对于(j=0;j我会将j的声明更改为
int

char mark;

for(int j=0; j<5; j++){
    printf("Enter mark for %s: ", names[j]);
    scanf("%d", &mark);
}
char标记;

对于(int j=0;j我会将j的声明更改为
int

char mark;

for(int j=0; j<5; j++){
    printf("Enter mark for %s: ", names[j]);
    scanf("%d", &mark);
}
char标记;

对于(int j=0;j您正在将
1字节
变量(
char
)的地址传递给一个函数,该函数将威胁它作为
int
指针

如果我们假设
int
4字节
scanf
覆盖
mark
变量附近堆栈的
3字节


第一个可能是,
j

您正在将
1字节的
变量(
char
)的地址传递给一个函数,该函数将威胁它作为
int
指针

如果我们假设
int
4字节
scanf
覆盖
mark
变量附近堆栈的
3字节


第一个可能是,
j

您已经声明
标记为
char
,但是在
scanf
调用中,您使用的是
d
转换说明符,该说明符期望其相应的参数具有type
int*
,而不是
char*
。使用错误的转换说明符会导致未定义的行为

我想推测
mark
j
在内存中是相邻的,在读取
mark
的整数值(可能是2到4个字节宽)的过程中,
j
的值被覆盖

mark
是否应表示数值(
90
75
等)?如果是,请将
mark
的类型从
char
更改为
int

char mark;

for(int j=0; j<5; j++){
    printf("Enter mark for %s: ", names[j]);
    scanf("%d", &mark);
}
如果
mark
应该表示字母等级(
a
B
等),则将
scanf
调用更改为

scanf( " %c", &mark ); // note leading whitespace

您已将
mark
声明为
char
,但在
scanf
调用中,您使用的是
d
转换说明符,该说明符期望其相应的参数具有type
int*
,而不是
char*
。使用错误的转换说明符会导致未定义的行为

我想推测
mark
j
在内存中是相邻的,在读取
mark
的整数值(可能是2到4个字节宽)的过程中,
j
的值被覆盖

mark
是否应表示数值(
90
75
等)?如果是,请将
mark
的类型从
char
更改为
int

char mark;

for(int j=0; j<5; j++){
    printf("Enter mark for %s: ", names[j]);
    scanf("%d", &mark);
}
如果
mark
应该表示字母等级(
a
B
等),则将
scanf
调用更改为

scanf( " %c", &mark ); // note leading whitespace

为什么j是一个
char
,然后在循环中用作索引?
scanf(“%c”,&mark);
?那不是一个
char
?还是应该是
int
。您传递了
标记[]
但忽略了它。
%d
需要一个
int
。您正在传递一个
char
,因此
scanf
j
变量覆盖到堆栈中…是:使用自然大小
int
,除非有充分的理由不这样做。为什么j a
char
然后用作循环中的索引?
scanf(%c,&mark)
?那不是一个
char
?还是应该是
int
。你通过了
标记[]
但忽略了它。
%d
需要一个
int
。您正在传递一个
char
,因此
scanf
j
变量覆盖到堆栈中……是的:使用自然大小
int
,除非有充分的理由不这样做。这并不能解决真正的问题(甚至提到它)。这并不能解决真正的问题(甚至提及)不,我特别选择了字符,因为我只需要少于128@ACarter:最好使用
int
并执行您自己的范围检查,但可以。如果您希望读取数值并将其存储在
char
类型中,则使用
%hhd
作为转换说明符,而不是
%d
,因此
scanf
将读取c正确的字节数。不,我特别选择了字符,因为我只需要小于128@ACarter:最好使用
int
并执行您自己的范围检查,但可以。如果您希望读取数值并将其存储在
char
类型中,则使用
%hhd
作为转换说明符,而不是
%d
so
scanf将读取正确的字节数。