C语言scanf读取字符存入数组时索引0无有效值问题求解
问题描述
C语言开发中使用scanf()函数获取用户输入字符存入字符数组时,数组索引0位置始终没有存储有效输入值,测试代码如下:
#include<stdio.h> int main() { int n,i; printf("Enter number of characters to store: "); scanf("%d", &n); // 读取字符数组长度 char ch_arr[n+1]; printf("Enter the string: "); for(i=0;i<n+1;i++){ scanf("%c",&ch_arr[i]); // 逐个读取用户输入字符 } printf("You have entered: \n"); for(i=0;i<n+1;i++){ printf("Index %d = %c\n",i,ch_arr[i]); // 打印字符数组内容 } printf("\nThe character at index 2 is =%c",ch_arr[2]); return 0; }
代码运行输出如下:
Enter number of characters to store: 5 Enter the string: stack You have entered: Index 0= Index 1= s Index 2= t Index 3= a Index 4= c Index 5= k The character at index 2 is =t
预期结果为索引2位置存储字符a,索引0位置存储有效输入字符,要求不使用gets()等其他输入方法解决该问题。
问题成因
问题根源是输入缓冲区的残留换行符:
- 执行
scanf("%d", &n)读取输入数字时,函数只会将数字字符从标准输入缓冲区取出,用户输入完数字后按下回车对应的换行符\n会残留在缓冲区中。 %c格式符的读取规则是读取输入缓冲区的第一个字符,不会跳过任何空白字符(空格、换行、制表符等)。因此循环中第一次执行scanf("%c",&ch_arr[i])时,会直接把缓冲区残留的换行符读入ch_arr[0],后续输入的所有字符都向后偏移1位存储,最终导致索引0显示为空,其余位置字符全部错位。
解决方案
方法1(自动跳过空白,推荐)
修改读取字符的scanf格式串,在%c前加一个空格即可,修改后的读取语句为:
scanf(" %c",&ch_arr[i]);
格式串中前置的空格会告知scanf跳过读取前所有连续的空白字符,直接读取第一个有效非空白字符,自动清除之前残留的换行符影响,不需要额外调用其他输入函数。
方法2(支持读取输入中的空格)
如果需要保留读取输入中空格字符的能力,可以在读取完数字n后,手动消耗掉缓冲区残留的换行符,在scanf("%d", &n);语句后添加一行:
getchar();
该语句会直接读走缓冲区里残留的单个换行符,后续循环读取字符时就会从用户输入的第一个有效字符开始读取,不会出现偏移问题。
内容的提问来源于stack exchange,提问作者hari hara sankar
相关产品推荐
相关产品推荐

