You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 19:17:45