QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 772|回复: 5

一个c语言问题,结果显示不正常啊!!!

[复制链接]
发表于 2003-7-1 20:00:57 | 显示全部楼层 |阅读模式
//年月日转化
#include <stdio.h>

void print(char year[4],char month[2],char day[2])
{
  int i;
  for (i=0;i<4;i++)
    {
      if (year < 10 || year > -1)
        {
          switch(year)
            {
            case '1': printf("一");
              break;
            case '2': printf("二");
              break;
            case '3': printf("三");
              break;
            case '4': printf("四");
              break;
            case '5': printf("五");
              break;
            case '6': printf("六");
              break;
            case '7': printf("七");
              break;
            case '8': printf("八");
              break;
            case '9': printf("九");
              break;
            case '0': printf("零");
              break;
            }
        }
      else printf("输入的年的格式错误!\n");
    }
  printf("年");
  for (i=0;i<2;i++)
    {
      if (month < 10 || month > -1)
        {
          switch(month)
            {
            case '1': printf("一");
              break;
            case '2': printf("二");
              break;
            case '3': printf("三");
              break;
            case '4': printf("四");
              break;
            case '5': printf("五");
              break;
            case '6': printf("六");
              break;
            case '7': printf("七");
              break;
            case '8': printf("八");
              break;
            case '9': printf("九");
              break;
            case '0': printf("零");
              break;
            }
        }
      else printf("输入的月的格式错误!");
    }
  printf("月");
  for (i=0;i<2;i++)
    {
      if (day < 10 || day > -1)
        {
          switch(day)
            {
            case '1': printf("一");
              break;
            case '2': printf("二");
              break;
            case '3': printf("三");
              break;
            case '4': printf("四");
              break;
            case '5': printf("五");
              break;
            case '6': printf("六");
              break;
            case '7': printf("七");
              break;
            case '8': printf("八");
              break;
            case '9': printf("九");
              break;
            case '0': printf("零");
              break;
            }
        }
      else printf("输入的日期出错了!");
    }
  printf("日");
}

main()
{
  char year[4],month[2],day[2];
  
  printf("输入年:");
  scanf("%s",&year);
  printf("\n");

  printf("输入月:");
  scanf("%s",&month);
  printf("\n");

  printf("输入日:");
  scanf("%s",&day);
  printf("\n");

  print(year,month,day);
  printf("\n");
}


我要的结果没有正常显示啊!!!

输入年:2002

输入月:12

输入日:12

零零二年二月一二日

这就是变态的结果了,我的天啊!!!!! :-(  :-(  :-(  :-(  :-(  :-(  :-(  :-(
 楼主| 发表于 2003-7-1 21:07:24 | 显示全部楼层
怎么没有人回答!!!
我改进后的程序如下:
#include <stdio.h>

void switchchar(char a)
{
  switch(a)
    {
    case '1': printf("一");
      break;
    case '2': printf("二");
      break;
    case '3': printf("三");
      break;
    case '4': printf("四");
      break;
    case '5': printf("五");
      break;
    case '6': printf("六");
      break;
    case '7': printf("七");
      break;
    case '8': printf("八");
      break;
    case '9': printf("九");
      break;
    case '0': printf("零");
      break;
    }
}


void print(char year[4],char month[2],char day[2])
{
  int i;
  for (i=0;i<4;i++)
    {
      if (year < 10 || year > -1)
        {
          switchchar(year);
        }
    }
  printf("年");


  for (i=0;i<2;i++)
    {
        if (month < 10 || month > -1)
        {
          switchchar(month);
        }
    }
  printf("月");


  for (i=0;i<2;i++)
    {
        if (day < 10 || day > -1)
        {
          switchchar(day);
        }
    }
  printf("日");
}


main()
{
  char year[4],month[2],day[2];

  printf("输入年份:");
  scanf("%s",&year);
  printf("\n");

  printf("输入月份:");
  scanf("%s",&month);
  printf("\n");

  printf("输入日期:");
  scanf("%s",&day);
  printf("\n");

  print(year,month,day);
  printf("\n");
}

结果还是正常啊!!!!
输入年份:2002

输入月份:12

输入日期:12

零零二年二月一二日
:-(
回复

使用道具 举报

发表于 2003-7-1 21:52:16 | 显示全部楼层
day < 10 || day > -1
是不是先要转换成int再比较?
回复

使用道具 举报

发表于 2003-7-1 22:13:44 | 显示全部楼层
这是你赋值的时候出的错
你的3个char数组都定义的不够大.
第一个定义为5,第二个和第3个都定义成3
这是关键错误,还有year < 10 || year > -1这个判断语句是不对的,应该是year<='9'&&year>='0'
还有主函数里面的&year,&month ,&day,虽然这里没有错,因为在这里year,month,day都已经本身就是数组的 首地址了,再加上取地址符值依然没有变化.但是也许到了别的地方就会出错.
3个数组错误的原因是因为你用的是字符串赋值
scanf("%s",year);
scanf("%s",month);
scanf("%s",day);
按你贴子里面的赋值,
从year 开始,是'2','0','0','2','\0',因为是用的字符串赋值,所以会在后面加上一个结束符'\0',可是scanf并不进行边界检查.
后来的month是,'1','2','\0'这里最后一个month的'\0'把year的第一个字符给擦掉了,结果导致了没有第一个字符,后面的day也使擦掉了month的第一个字符,所以出现了你的结果.而year后面的'\0'擦掉了什么,我们不知道,这是很危险的.
如果你用
2002
2
2
进行赋值,不会出现这个情况,这时候程序运行正确,这种错误往往不好找出来.
其实你这个问题是一个典型的缓冲区溢出的问题,而由于scanf系列的函数不进行边界检查,所以使用的时候要慎重.
建议用一个char类型的指针,而不是自己指定数组大小.
回复

使用道具 举报

发表于 2003-7-2 14:31:37 | 显示全部楼层
你的3个char数组都定义的不够大.
第一个定义为5,第二个和第3个都定义成3


数组后的数代表数组个数,应该是533
回复

使用道具 举报

发表于 2003-7-2 23:05:41 | 显示全部楼层
if (day < 10 || day > -1)
if (month < 10 || month > -1)
if (year < 10 || year > -1)

首先这个比较没有意义,day是字符型的永远大于-1
而且用"或"所以恒为true
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-15 14:04 , Processed in 0.038775 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表