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

C语言中输入变量指定字符串长度时丢失最后字符的问题

C语言字符串输入反转:用户指定长度时丢失字符问题解决

问题重现

手动实现字符串输入与反转功能时,直接用固定数值(如5)定义字符数组长度,代码运行正常;但通过用户输入len指定长度时,输入长度5并输入字符串"apple",原字符串仅显示"appl",反转后为"lppa",丢失最后一个字符。仅在用户输入len时出现该问题,直接给len赋值(如int len = 5;)则正常。原代码如下:

#include <stdio.h>
int main()
{
int len;
printf("enter length : ");
scanf("%d", &len);
int i, j = len-1;
char str[len], rev[len];

printf("enter string of length %d : ", len);
for (i = 0; i < len; i++)
{
    scanf("%c", &str[i]);
    rev[j] = str[i];
    j--;
}

i = 0;
printf("the string is : ");
for (i = 0; i < len; i++)
    printf("%c", str[i]);

j = 0;
printf("\nrev string is : ");
for (j = 0; j < len; j++)
    printf("%c", rev[j]);
return 0;
}

问题原因

scanf("%d", &len)读取整数后,输入缓冲区中会残留一个换行符\n\,后续的scanf("%c", &str[i])会优先读取这个换行符,占用了str[0]的位置。循环执行len次后,实际只有len-1个有效字符被存入数组,最后一个有效字符的位置被换行符挤占,导致输出时看起来丢失了最后一个字符。

修复方案

方案1:读取整数后清空缓冲区残留的换行符

在scanf("%d", &len)之后,调用getchar()吃掉缓冲区中的换行符:

#include <stdio.h>
int main()
{
int len;
printf("enter length : ");
scanf("%d", &len);
getchar(); // 吃掉输入len后留下的换行符
int i, j = len-1;
char str[len], rev[len];

printf("enter string of length %d : ", len);
for (i = 0; i < len; i++)
{
    scanf("%c", &str[i]);
    rev[j] = str[i];
    j--;
}

i = 0;
printf("the string is : ");
for (i = 0; i < len; i++)
    printf("%c", str[i]);

j = 0;
printf("\nrev string is : ");
for (j = 0; j < len; j++)
    printf("%c", rev[j]);
return 0;
}

方案2:在scanf("%c")前添加空白符跳过空白字符

修改scanf("%c", &str[i])为scanf(" %c", &str[i]),注意%c前的空格,它会自动跳过输入缓冲区中的所有空白字符(包括换行、空格、制表符等):

#include <stdio.h>
int main()
{
int len;
printf("enter length : ");
scanf("%d", &len);
int i, j = len-1;
char str[len], rev[len];

printf("enter string of length %d : ", len);
for (i = 0; i < len; i++)
{
    scanf(" %c", &str[i]); // 前面加空格跳过空白字符
    rev[j] = str[i];
    j--;
}

i = 0;
printf("the string is : ");
for (i = 0; i < len; i++)
    printf("%c", str[i]);

j = 0;
printf("\nrev string is : ");
for (j = 0; j < len; j++)
    printf("%c", rev[j]);
return 0;
}

两种方案都能解决缓冲区残留换行符的问题,确保后续读取的都是用户输入的有效字符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 05:40:22