C语言printf无法输出变量存储的整数,输入分数后打印值均为0的问题求助
问题原因与解决办法
嘿,我一眼就瞅出问题出在哪啦!你代码里的分数全部变成0,是因为字符串数组越界导致的内存覆盖。
具体问题分析
你定义的等级变量比如char gradeComm[1];是长度为1的字符数组,但用scanf("%s", &gradeComm)读取输入时,C语言的%s格式符会把输入的内容当作字符串处理,而字符串必须以**空终止符\0**结尾。这就意味着,哪怕你只输入一个字符(比如"A"),程序也需要2个字节的空间来存储:一个存字符'A',一个存\0。但你的数组只有1个字节的空间,溢出的\0就会直接覆盖掉后面相邻的整数变量(比如marksEco),把它们的值改成0,最后打印出来自然全是0了。
另外还有个小细节:用scanf("%s", &gradeComm)的时候,其实不需要加&,因为数组名本身就代表数组首元素的地址,写成scanf("%s", gradeComm)才是正确的写法,但这不是导致分数变0的核心原因。
两种解决办法
方法1:扩大字符数组的长度
把所有等级数组的长度改成至少2,这样就能容纳单个字符加空终止符了:
#include <stdio.h> #include <stdlib.h> int main() { int marksComm; char gradeComm[2]; // 长度改为2 int marksEco; char gradeEco[2]; int marksCompsys; char gradeCompsys[2]; int marksProg; char gradeProg[2]; int marksDis; char gradeDis[2]; int marksLab; char gradeLab[2]; int marksPhy; char gradePhy[2]; printf("CCS001\nMarks> "); scanf("%d", &marksComm); printf("Grade> "); scanf("%s", gradeComm); // 去掉&,数组名直接作为地址 printf("\nCCS009\nMarks> "); scanf("%d", &marksEco); printf("Grade> "); scanf("%s", gradeEco); printf("\nCSC111\nMarks> "); scanf("%d", &marksCompsys); printf("Grade> "); scanf("%s", gradeCompsys); printf("\nCSC112\nMarks> "); scanf("%d", &marksProg); printf("Grade> "); scanf("%s", gradeProg); printf("\nCSC113\nMarks> "); scanf("%d", &marksDis); printf("Grade> "); scanf("%s", gradeDis); printf("\nCSC126\nMarks> "); scanf("%d", &marksPhy); printf("Grade> "); scanf("%s", gradePhy); printf("\nCSC115\nMarks> "); scanf("%d", &marksLab); printf("Grade> "); scanf("%s", gradeLab); printf("\nCourse Code Marks Grade\n"); printf("CCS001 %d %s \n", marksComm, gradeComm); printf("CCS009 %d %s \n", marksEco, gradeEco); printf("CSC111 %d %s \n", marksCompsys, gradeCompsys); printf("CSC112 %d %s \n", marksProg, gradeProg); printf("CSC113 %d %s \n", marksDis, gradeDis); printf("CSC115 %d %s \n", marksLab, gradeLab); printf("CSC126 %d %s \n", marksPhy, gradePhy); }
方法2:直接用char类型变量存储等级
既然等级是单个字符,没必要用数组,直接用char类型更简单,还能避免数组越界问题:
#include <stdio.h> #include <stdlib.h> int main() { int marksComm; char gradeComm; // 改为char类型 int marksEco; char gradeEco; int marksCompsys; char gradeCompsys; int marksProg; char gradeProg; int marksDis; char gradeDis; int marksLab; char gradeLab; int marksPhy; char gradePhy; printf("CCS001\nMarks> "); scanf("%d", &marksComm); printf("Grade> "); scanf(" %c", &gradeComm); // 注意前面的空格,用来跳过缓冲区的换行符 printf("\nCCS009\nMarks> "); scanf("%d", &marksEco); printf("Grade> "); scanf(" %c", &gradeEco); printf("\nCSC111\nMarks> "); scanf("%d", &marksCompsys); printf("Grade> "); scanf(" %c", &gradeCompsys); printf("\nCSC112\nMarks> "); scanf("%d", &marksProg); printf("Grade> "); scanf(" %c", &gradeProg); printf("\nCSC113\nMarks> "); scanf("%d", &marksDis); printf("Grade> "); scanf(" %c", &gradeDis); printf("\nCSC126\nMarks> "); scanf("%d", &marksPhy); printf("Grade> "); scanf(" %c", &gradePhy); printf("\nCSC115\nMarks> "); scanf("%d", &marksLab); printf("Grade> "); scanf(" %c", &gradeLab); printf("\nCourse Code Marks Grade\n"); printf("CCS001 %d %c \n", marksComm, gradeComm); // 打印用%c格式符 printf("CCS009 %d %c \n", marksEco, gradeEco); printf("CSC111 %d %c \n", marksCompsys, gradeCompsys); printf("CSC112 %d %c \n", marksProg, gradeProg); printf("CSC113 %d %c \n", marksDis, gradeDis); printf("CSC115 %d %c \n", marksLab, gradeLab); printf("CSC126 %d %c \n", marksPhy, gradePhy); }
这里的" %c"前面加空格是为了跳过之前输入整数后留在缓冲区的换行符,不然程序会直接把换行符当作等级输入,导致读取错误。
额外提醒
如果用方法1,输入等级的时候一定要确保只输入单个字符,要是输入多个字符,还是会出现数组越界的问题哦~
内容的提问来源于stack exchange,提问作者Sen ZmaKi
相关产品推荐
相关产品推荐

