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
相关产品推荐
相关产品推荐

