为什么scanf或fgetc无法正常工作

时间:2013-11-21 03:26:38

标签: c gcc

以下是我的代码,并没有停止第一个索引,我想知道为什么?与scanf

的结果相同
#include<stdio.h>

void main()
{
  int n = 0, i = 0;
  char arr[10];
  printf("How many  characters do u want to enter ");
  scanf("%d", &n);
  //printf("\n\t%d", n);
  for(i = 0; i < n; i++)
  {     
    printf("Enter %d character-->\n",i);
    char ch = fgetc(stdin);
    arr[i] = ch;
    //putchar(arr[i]);    
  }     
  i = 0;
  printf("You have entered characters are \n");
  for(i = 0; i < n; i++)
  {     
    printf("arr[%d] = %c\n", i, arr[i]);
  }     
  printf("\n");
}

当我运行此代码时,我得到了以下

How many  characters do u want to enter 5
Enter 0 character-->
Enter 1 character-->

程序不会等待第一个字符输入。

2 个答案:

答案 0 :(得分:3)

输入流上有一个结束字符由scanf("%d",&n)留在那里,并由第一个fgetc

读取
  

scanf

的结果相同

您是否正确使用scanf?请尝试以下操作(不要错过%c之前的空格):

for(i = 0; i < n; i++)
{
    printf("Enter %d character-->\n",i);
    scanf(" %c", &arr[i]);
}

答案 1 :(得分:1)

终端往往是行缓冲的,这意味着流内容可以逐行访问。

因此,当fgetc从STDIN开始读取时,它会读取一个字符并留下换行符。因此,您应该使用Cubbi建议的scanf()scanf(" %c", &arr[i]);。或者你需要丢弃该换行符。你可以用这个

  for(i = 0; i < n; i++)
  {     
    printf("Enter %d character-->\n",i);
    char ch = fgetc(stdin);    // newline is consumed here
    if(ch=='\n')
        ch = fgetc(stdin);         // you get the expected value
    arr[i] = ch;
    //putchar(arr[i]);    
  }