回 帖 发 新 帖 刷新版面

主题:在做题目时发现一个有关C语言输入的问题。

做题时不小心在scanf()括号内多打了个空格 如下 scanf("%d %d %d ",&a,&b,&len);,正确的应该scanf("%d %d %d",&a,&b,&len);  由此便输入不争确了,要多输入一个数才会输出 。在我现有的经验里这应该是没有错得呀,,不知道为什么会这样。请问有人知道这个原因不??

如不清楚我具体指的是什么,下面有我整个代码 ,最后一行为要出入的数据。备注处应该为出错的地方。

#include<stdio.h>
#include<limits.h>
#define MAXN 501

int arcnum,vexnum;
int map[MAXN][MAXN];

void input()
{
    int i,j,len,a,b;
    scanf("%d %d",&vexnum,&arcnum);  

    for(i=0;i<vexnum;i++)
        for(j=0;j<vexnum;j++)
            map[i][j]=INT_MAX;   
    for(i=1;i<=arcnum;i++)
    {
        scanf("%d %d %d ",&a,&b,&len);      //该处有空格和无空格会有不同的效果
        if(len<map[a][b])
            map[a][b]=map[b][a]=len;   
    }
}
void prim()
{
    int i,j,now,small;
    int state[MAXN]={0};       
    int dis[MAXN];  
    int sum=0;       
    

    for(i=0;i<vexnum;i++)
        dis[i]=INT_MAX;       
    now=0; state[now]=1; dis[now]=0;  
    for(j=1;j<vexnum;j++)  
    {    
        for(i=0;i<vexnum;i++)
            if(!state[i]&&dis[i]>map[now][i])
                dis[i]=map[now][i];   
            
        small=INT_MAX;

        for(i=0;i<vexnum;i++)
            if(!state[i]&&small>dis[i])
                small=dis[now=i]; 
        state[now]=1;
        sum+=small;
            
    }
    printf("%d\n",sum);
    
}
int main()
{
    int cases;
    scanf("%d",&cases);   
    while(cases--)
    {
        input();
        prim();
    }
    return 0;
}

// 1 3 3 0 1 20 0 2 0 1 2 3

回复列表 (共2个回复)

沙发

给你摘取一段msdn上的函数说明:

[quote]
The format argument specifies the interpretation of the input and can contain one or more of the following: 

White-space characters: blank (' '); tab ('\t'); or newline ('\n'). A white-space character causes scanf to read, but not store, all consecutive white-space characters in the input up to the next non–white-space character. One white-space character in the format matches any number (including 0) and combination of white-space characters in the input.
[/quote]

板凳

拿scanf("%d %d ",&a,&b);为例,其中scanf的第二个%d后面还有一个“空格”,这个空格需要被键盘出入,但是在scanf中会把最后的空格当成输入结束的标志,没有意义,但这里的“空格”需要一个确实意义的空格,所以最后需要再输入一个数,使第二个%d和最后又输入的一个数之间的“空格”变成实实在在的空格,(简而言之,在sanf中,最后的空格不算空格,只有中间的空格才算空格)。。。你也可以不补充一个数,你补充一个“!”或者“#”之类的字符也是可以的。。

我来回复

您尚未登录,请登录后再回复。点此登录或注册