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

C语言printf输出字符串多余字符及积分值异常问题排查

问题分析与修复

1. 多余字符问题修复

你代码里的终止符位置写错了:

  • 当length=3时,循环i从0运行到2,结束后i=3,此时output[0]-output[2]是生成的随机字符,但output[3]是未初始化的垃圾值,而你把'\0'放在了output[4],导致printf输出时会把output[3]的垃圾值也打印出来,直到遇到终止符。
  • 正确做法是把终止符放在output[i],也就是循环结束后的i位置,刚好在有效字符末尾添加终止符。

修改这一行:

output[i] = '\0'; // 替换原代码中的output[i+1] = '\0';

2. 积分值异常修复

积分出现奇怪数值是因为scanf参数错误导致缓冲区溢出:

  • input是字符数组,直接传input就代表数组首元素地址(char*类型),你传&input是数组的地址(char(*)[25]类型),虽然编译器可能不报错,但输入字符串过长时会溢出缓冲区,覆盖points指针指向的内存,篡改积分值。
  • 建议给scanf加长度限制,确保最多读取MAX_LENGTH-1个字符(留位置放终止符)。

修改scanf行:

scanf("%24s", input); // 替换原代码中的scanf("%s", &input);

修正后的完整代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#define NELEMS(x) sizeof(x)/sizeof(x[0])
#define MAX_LENGTH 25

void randomString(int *points, int length);

int main()
{
    srand(time(NULL));
    int points = 0;

    randomString(&points, 3);

    return EXIT_SUCCESS;
}

void randomString(int *points, int length)
{    
    char input[MAX_LENGTH], output[MAX_LENGTH];
    do
    {
        int i;
        for (i = 0; i < length && i < NELEMS(output)-1; i++)
            output[i] = (char)(rand() % 26 + 97);
        output[i] = '\0'; // 修正终止符位置

        printf("You have %d points, type %s:\n", *points, output);
        scanf("%24s", input); // 修正scanf参数并添加长度限制

        strcmp(input, output) == 0 ? (*points)++ : (*points)--;        
        getchar();
    } while (input[0] != '@');
}

额外说明

  • 你注释掉的那段初始化代码for (int i = 0; i < NELEMS(output)-1; i++) output[i] = i < length ? ... : '\0';是更安全的写法,它会把所有未使用的位置都初始化为'\0',彻底避免垃圾值问题,也可以考虑使用。
  • 若要避免getchar()处理输入缓冲区残留内容的异常,可以替换成while(getchar() != '\n');来清空缓冲区。

内容的提问来源于stack exchange,提问作者nobbleDobble

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 03:16:35