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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 06:09:10