首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

这个程序有点有关问题,但不知如何改

2012-02-26 
这个程序有点问题,但不知怎么改#includestdio.h#includestdlib.h#include string.hintmain(intargc,

这个程序有点问题,但不知怎么改
#include   <stdio.h>
#include   <stdlib.h>
#include <string.h>

int   main(int   argc,   char   *argv[])
{
    int   i,j;
    float   day;
    int   tday,year,tyear;
    long   days;
    char   months[20][7]=   { "pop ", "no ", "zip ", "zotz ", "tzec ", "xul ", "yoxkin ", "mol ",
    "chen ", "yax ", "zac ", "ceh ", "mac ", "kankin ", "muan ", "pax ", "koyab ", "cumhu ", "uayet "};
    char   month[][9]={ "imix ", "ik ", "akbal ", "kan ", "chicchan ", "cimi ", "manik ", "lamat ",
    "muluk ", "ok ",   "chuen ", "eb ", "ben ", "ix ", "mem ", "cib ", "caban ", "eznab ", "canac ", "ahau "};
    int   m;
    char   mon[10];
    scanf( "%d ",&m);
    scanf( "%f ",&day);
    scanf( "%s ",&mon);
    scanf( "%d ",&year);
    while(m> 0)
    {
          for(i=0;i <20;i++)
          {
              if(strcmp(mon,months[i])==0)
              {
                  days=365*year+i*20+day+1;
                  break;
              }
          }
          tyear=days/260;
          days=days-tyear*260;
          j=days%20;
          if(j==0)
            j=20;
          tday=days%13;
          printf( "%d   %s   %d\n ",tday,month[j-1],tyear);
          scanf( "%f ",&day);
          gets(mon);
          scanf( "%d ",&year);
          m--;
    }
                                                       
    system( "PAUSE ");
    return   0;
}
这个程序我输入m为3时,后两次的循环我没有输入完整就会出结果,不知为什么?
谁运行以下看看

[解决办法]
没有问题
循环中的
scanf( "%f ",&day);
gets(mon);
scanf( "%d ",&year);
只能输入上面两个
[解决办法]
scanf是以回车键为输入结束标志的.gets也是一样.
当你输入整数完成之后结束标志回车键就留在了缓冲区里面,接着运行gets函数,它就从缓冲区里找字符,如果缓冲区里没有字符,它就会等待键盘输入.并直到用户输入回车字符为止.这是你想要的情况, 可遗憾的是,缓冲区里就有一个字符--回车字符.它就会把空值传给mon.接接着就运行下边的代码.

这样说不知道清楚了没有??

[解决办法]
//这是修改之后的



#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
int i,j;
float day;
int tday,year,tyear;
long days;
char months[20][7]= { "pop ", "no ", "zip ", "zotz ", "tzec ", "xul ", "yoxkin ", "mol ",
"chen ", "yax ", "zac ", "ceh ", "mac ", "kankin ", "muan ", "pax ", "koyab ", "cumhu ", "uayet "};
char month[][9]={ "imix ", "ik ", "akbal ", "kan ", "chicchan ", "cimi ", "manik ", "lamat ",
"muluk ", "ok ", "chuen ", "eb ", "ben ", "ix ", "mem ", "cib ", "caban ", "eznab ", "canac ", "ahau "};
int m;
char mon[10];
printf( "input m : ");
scanf( "%d ",&m);

while(m> 0)
{
printf( "-----------%d---------\n ",m);
printf( "input day : ");
scanf( "%f ",&day);
printf( "input mon : ");
scanf( "%s ",mon);
printf( "input year : ");
scanf( "%d ",&year);
m--;

for(i=0;i <20;i++)
{
if(strcmp(mon,months[i])==0)
{
days=365*year+i*20+day+1;
break;
}
}
tyear=days/260;
days=days-tyear*260;
j=days%20;
if(j==0)
j=20;
tday=days%13;
printf( "%d %s %d\n ",tday,month[j-1],tyear);

}

system( "PAUSE ");
return 0;
}
[解决办法]
还有一点.运行函数scanf时,这里假设它要求输入一个整数.它会先检查缓冲区里面有没有回车字符.有,如果回车字符不是在缓冲区里的第一个字符.那么就把回车键前面的字符赋给要赋值的整数变量.如果在它前面没有其它字符了,那就会把它处理掉,再找第二个回车字符.
gets它不会处理掉回车字符.

热点排行
Bad Request.