| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 624 人关注过本帖, 1 人收藏
标题:一个输出小程序,,,请各位高手帮忙看看,,,
只看楼主 加入收藏
C_596322153
Rank: 6Rank: 6
来 自:徽州
等 级:侠之大者
帖 子:182
专家分:466
注 册:2012-1-10
结帖率:100%
收藏(1)
已结贴  问题点数:20 回复次数:4 
一个输出小程序,,,请各位高手帮忙看看,,,
#include "stdio.h"
void main()
{
    float a,b;
    scanf("%f,%f",&a,&b);
    printf("%f,%5.3e",a,b);

}
输入3.14159,12345
输出3.141590,1.235e+004
正常
把printf("%f,%5.3e",a,b);改为printf("%u,%5.3e",a,b);
输出0,5.308e+315
为什么啊?难道改前一个输出还会影响下一个数啊?



搜索更多相关主题的帖子: void 315 include 影响 
2012-02-04 20:41
xingzhian
Rank: 2
等 级:论坛游民
帖 子:14
专家分:54
注 册:2011-3-22
收藏
得分:10 
经过查看,发现应该是以下的问题(编译器:DEV-C++ 4.9.9.2)
printf的定义中,将以上的参数转为字符串时出错。
源代码如下:
/*******************************************************
int vsprintf(char *buf, const char *fmt, va_list args)  {    int len;    unsigned long num;    int i, base;    char *str;    char *s;      int flags;            // Flags to number()      int field_width;    // Width of output field    int precision;    // Min. # of digits for integers; max number of chars for from string    int qualifier;    // 'h', 'l', or 'L' for integer fields      for (str = buf; *fmt; fmt++)    {      if (*fmt != '%')      {        *str++ = *fmt;        continue;      }                  // Process flags      flags = 0;  repeat:      fmt++; // This also skips first '%'      switch (*fmt)      {        case '-': flags |= LEFT; goto repeat;        case '+': flags |= PLUS; goto repeat;        case ' ': flags |= SPACE; goto repeat;        case '#': flags |= SPECIAL; goto repeat;        case '0': flags |= ZEROPAD; goto repeat;      }              // Get field width      field_width = -1;      if (is_digit(*fmt))        field_width = skip_atoi(&fmt);      else if (*fmt == '*')      {        fmt++;        field_width = va_arg(args, int);        if (field_width  < 0)        {      field_width = -field_width;      flags |= LEFT;        }      }        // Get the precision      precision = -1;      if (*fmt == '.')      {        ++fmt;            if (is_digit(*fmt))          precision = skip_atoi(&fmt);        else if (*fmt == '*')        {          ++fmt;          precision = va_arg(args, int);        }        if (precision  < 0) precision = 0;      }        // Get the conversion qualifier      qualifier = -1;      if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L')      {        qualifier = *fmt;        fmt++;      }        // Default base      base = 10;        switch (*fmt)      {        case 'c':      if (!(flags & LEFT)) while (--field_width > 0) *str++ = ' ';      *str++ = (unsigned char) va_arg(args, int);      while (--field_width > 0) *str++ = ' ';      continue;          case 's':      s = va_arg(args, char *);      if (!s)    s = " <NULL>";      len = strnlen(s, precision);      if (!(flags & LEFT)) while (len  < field_width--) *str++ = ' ';      for (i = 0; i  < len; ++i) *str++ = *s++;      while (len  < field_width--) *str++ = ' ';      continue;          case 'p':      if (field_width == -1)      {        field_width = 2 * sizeof(void *);        flags |= ZEROPAD;      }      str = number(str, (unsigned long) va_arg(args, void *), 16, field_width, precision, flags);      continue;          case 'n':      if (qualifier == 'l')      {        long *ip = va_arg(args, long *);        *ip = (str - buf);      }      else      {        int *ip = va_arg(args, int *);        *ip = (str - buf);      }      continue;          case 'A':      flags |= LARGE;          case 'a':      if (qualifier == 'l')        str = eaddr(str, va_arg(args, unsigned char *), field_width, precision, flags);      else        str = iaddr(str, va_arg(args, unsigned char *), field_width, precision, flags);      continue;          // Integer number formats - set up the flags and "break"        case 'o':      base = 8;      break;          case 'X':      flags |= LARGE;          case 'x':      base = 16;      break;          case 'd':        case 'i':      flags |= SIGN;          case 'u':      break;          case 'E':        case 'G':        case 'e':        case 'f':        case 'g':          str = flt(str, va_arg(args, double), field_width, precision, *fmt, flags | SIGN);      continue;          default:      if (*fmt != '%') *str++ = '%';      if (*fmt)        *str++ = *fmt;      else        --fmt;      continue;      }        if (qualifier == 'l')        num = va_arg(args, unsigned long);      else if (qualifier == 'h')      {        if (flags & SIGN)      num = va_arg(args, short);        else      num = va_arg(args, unsigned short);      }      else if (flags & SIGN)        num = va_arg(args, int);      else        num = va_arg(args, unsigned int);        str = number(str, num, base, field_width, precision, flags);    }      *str = '\0';    return str - buf;  }
*************************************************************************/
也就是说,有可能将float型先输出一个unsigned short,后面两个字节又与四字节的float b被输出,但只是六字节中的四个。从而出现这样问题。
所以,如果是这样的话,最后一个变量b将会被正确输出。
printf("%u,%u,%5.3e",a,b);  //%u %u 输出 float a, %5.3e 输出 float b
2012-02-05 11:21
C_596322153
Rank: 6Rank: 6
来 自:徽州
等 级:侠之大者
帖 子:182
专家分:466
注 册:2012-1-10
收藏
得分:0 
额。。。不太懂啊  
2012-02-06 08:17
fahfuq
Rank: 2
等 级:论坛游民
帖 子:30
专家分:23
注 册:2012-1-21
收藏
得分:0 
飘过
2012-02-06 08:32
墨清扬
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:294
专家分:817
注 册:2011-10-4
收藏
得分:10 
printf不知道你转给它的a是什么类型,就要靠前面对应的%*,你之前写%f,它就认为应该按浮点数的格式来转换那个数据,那就是正确的;但是你写的是%u的话,按照无符号整数来读取显然就会出错

酱油实习生
2012-02-06 10:43
快速回复:一个输出小程序,,,请各位高手帮忙看看,,,
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033419 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved