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

