【问题标题】:printf sometimes prints extra garbageprintf 有时会打印出额外的垃圾
【发布时间】:2023-03-28 10:17:01
【问题描述】:

我正在解析 .ppm 文件,使用 fgetc 一次读取一个字节,然后通过除以 255.0 将它们转换为浮点数以获取用于 OpenGL 代码的颜色。这很简单。我使用printf("%f %f %f\n", color[0], color[1], color[2]); 将这些数字打印出来以进行调试。大多数情况下它运行良好(见第一行),但偶尔会打印出额外的垃圾(见第二行)。

0.086275 0.031373 0.000000
0.133333 0.000000 0.00<BA><B9>9?<D1><D0><D0>=<99><98>^X>3 0.078431 0.000000

任何想法为什么会这样?

更新:

float *read_eight_bit(FILE *file, int rows, int cols)                                                                                                                                                                                                                          
{                                                                                                                                                                                                                                                                              
   float *data = (float *)malloc(rows*cols*3*sizeof(float));                                                                                                                                                                                                                    
   int c;                                                                                                                                                                                                                                                                       
   int i, j, k;                                                                                                                                                                                                                                                                 
   for(i = 0; i < rows; i++) {                                                                                                                                                                                                                                                  
     for(j = 0; j < cols; j++) {                                                                                                                                                                                                                                                
         for(k = 0; k < 3; k++) {                                                                                                                                                                                                                                                 
           if((c = fgetc(file)) != EOF) {                                                                                                                                                                                                                                                              
             data[get_index(i, j, k, rows, cols)] = c/255.0f;                                                                                                                                                                                                                     
           }                                                                                                                                                                                                                                                                      
           else {                                                                                                                                                                                                                                                                 
             perror("reached unexpected EOF");                                                                                                                                                                                                                                    
             free(data);                                                                                                                                                                                                                                                          
             return NULL;                                                                                                                                                                                                                                                         
         }                                                                                                                                                                                                                                                                      
     }                                                                                                                                                                                                                                                                                                                                          
   return data;
}

这是读取内容的实际代码。

【问题讨论】:

  • 您将浮点数格式化为整数。使用 printf("%f %f %f\n".... 看看会发生什么。
  • 哎呀,错了——代码有"%f"。我将编辑问题。
  • 如果您不发布有问题的代码sn-p,则无法为您提供帮助
  • 给我们一些sscce.org代码
  • 好吧,如果 color[x] 不是浮点(或双精度?)类型,则会引发未定义的行为。如果是这样,请尝试投射它们。 *.com/questions/11382694/…

标签: c printf


【解决方案1】:

在没有看到更多代码的情况下我能想到的唯一解释是堆栈以某种方式被搞砸了,可能是由于缓冲区溢出或欠载(写入数组之外)。

我建议通过cppcheck 运行您的代码,因为它可以检测到许多此类问题。

【讨论】: