当我在C中询问第二个数字时,为什么我会得到一个新行,要求我引入一个数字?

时间:2015-03-10 21:55:57

标签: c scanf

我有这个简单的代码来从键盘读取矩阵。

#include<stdio.h>
#include"functii.h"

int main()
{
    float a[50][50];
    float t[50][50];
    int n; //linii si coloanele

    printf("\n Enter the rows and col of the matrix=");
    scanf("%d", &n);
    citireMatrice(a,n); //read the matrix
    //afisareMatrice(a,n); //show the matrix

    return 0;
}

使用functii.c

void citireMatrice(float x[50][50],int n)
{
    int i,j;

    for(i=0;i<n;++i)
    {
        for(j=0;j<n;++j)
        {
        printf("a[%d][%d]=",i,j);
        scanf("%f ",&x[i][j]);
        }
    }

}

标题包含原型。 问题是,当我运行程序时,在输入第一个数字后,我得到一个没有文本的空行,允许我输入第二个数字,算法继续,而不是存储输入的最后一个数字。 它是这样的:

a[0][0]=1
2 //entered by me
a[0][1]=3
a[0][2]=1
a[1][0]=2
a[1][1]=3
a[1][2]=1
a[2][0]=2
a[2][1]=3
a[2][2]=4
1.000000 2.000000 3.000000 
1.000000 2.000000 3.000000 
1.000000 2.000000 3.000000 

1 个答案:

答案 0 :(得分:0)

@BLUEPIXY has already explained how to solve the problem

原因是因为%f之后的空格:

scanf("%f ",&x[i][j]);
       //^ This space is the trouble-maker

空格是一个空白字符。让我们看看C11标准对此有何看法:

  

7.21.6.2 fscanf功能

     

[...]

     
      
  1. 由空白字符组成的指令通过读取第一个非空白字符(仍然未读取)的输入来执行,或者直到不再能够读取字符为止。该指令永远不会失败。
  2.   

因此,空格字符消耗所有空白字符(如果有)直到第一个非空白字符

当您输入要扫描的号码并按Enter键时,%f中的scanf会消耗该号码,而空格会丢弃换行符,然后等待....等待它遇到非空白字符。这就是为什么你必须为scanf中的空格输入一个额外的数字来停止丢弃空格字符的原因。