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
转换说明符,该说明符期望其相应的参数具有typeint*
,而不是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
转换说明符,该说明符期望其相应的参数具有typeint*
,而不是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 achar
然后用作循环中的索引?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
soscanf代码>将读取正确的字节数。