警告:格式'%d'需要匹配的'int'参数[-Wformat =]

时间:2017-08-22 05:25:27

标签: c

#include <stdio.h>
#include <math.h>
#include <stdlib.h> 
#include <time.h>  

int main()
{

    FILE *bp=NULL;
    bp = fopen("binary.txt","w");
    if(bp == NULL)
    printf("Error!\n");
    else
   // {

        srand(unsigned(time(NULL)));
        int M = RAND_MAX / 2;
        int N = 100000;
        int s[N], ss[N-1];
        for(int i=0; i<N; i++)
        {

             if(rand() > M)
             s[i] = 1;
             else
             s[i] = 0;


        }
       for(int i=0, j=0; i<N-1; i++)
       {
         if(!s[i])
         {
               if(s[i+1])
                 ss[j] = 1;
                 else
                ss[j] = 0;
                j++;


            }

            if(s[i])
          {
               if(!s[i+1])
                 ss[j] = 0;//-1;
                else
                 ss[j] = -1;//0;
                 j++;


           }
              if(s[i])
          {
               if(s[i+1])
                 ss[j] = -1;
                else
                 ss[j] = 0;
                 j++;


           }


           //fprintf(bp,"%d\t%d\t%d\n",s[i],s[i+1],ss[j-1]);
           fprintf(bp,"%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t\
           %d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t\
           %d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t\
           %d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n",
           s[i],s[i+1],s[i+2],s[i+3],s[i+4],s[i+5],s[i+6],s[i+7],s[i+8],s[i+9],s[i+10],s[i+11],s[i+12],s[i+13],s[i+14],s[i+15],
           s[i+16],s[i+17],s[i+18],s[i+19],s[i+20],s[i+21],s[i+22],s[i+23],s[i+24],s[i+25],s[i+26],
           s[i+27],s[i+28],s[i+29],s[i+30,s[i+31],s[i+32],s[i+33],s[i+34],s[i+35]],s[i+36],s[i+37],
           s[i+38],s[i+39],s[i+40],s[i+41],s[i+42],s[i+43],s[i+44],s[i+45],s[i+46],s[i+47],s[i+48],
           s[i+49],s[i+50],s[i+51],s[i+52],s[i+53],s[i+54],s[i+55],s[i+56],s[i+57],s[i+58],s[i+59],
           s[i+60],s[i+61],s[i+62],s[i+63],s[i+64],s[i+65],s[i+66],s[i+67],s[i+68],s[i+69],s[i+70],
           s[i+71],s[i+72],s[i+73],s[i+74],s[i+75],s[i+76],s[i+77],s[i+78],s[i+79],s[i+80],s[i+81],
           s[i+82],s[i+83],s[i+84],s[i+85],s[i+86],s[i+87],s[i+88],s[i+89],s[i+90],s[i+91],s[i+92],
           s[i+93],s[i+94],s[i+95],s[i+96],s[i+97],s[i+98],s[i+99]);


         }

       return 0; 
   // }


   //  fclose(bp);
     //bp = NULL;

} 

错误讯息:

binary3.c: In function ‘int main()’:
binary3.c:78:67: warning: format ‘%d’ expects a matching ‘int’ argument [-Wformat=]
            s[i+93],s[i+94],s[i+95],s[i+96],s[i+97],s[i+98],s[i+99]);
                                                                   ^
binary3.c:78:67: warning: format ‘%d’ expects a matching ‘int’ argument [-Wformat=]
binary3.c:78:67: warning: format ‘%d’ expects a matching ‘int’ argument [-Wformat=]
binary3.c:78:67: warning: format ‘%d’ expects a matching ‘int’ argument [-Wformat=]
binary3.c:78:67: warning: format ‘%d’ expects a matching ‘int’ argument [-Wformat=]
vanita@banhita:~/Desktop$ 

1 个答案:

答案 0 :(得分:3)

您对fprintf()的可怕致电包括:

s[i+27],s[i+28],s[i+29],s[i+30,s[i+31],s[i+32],s[i+33],s[i+34],s[i+35]],
                              ^                                       ^

请注意第一个插入符号上方的缺失括号,以及第二个插入符号上方的额外符号(pointed outRetired Ninja)。当您查看代码时,它会显示为不一致的对齐方式。我不认为您显示所有错误消息。由于包围,您实际上没有打印5个值(i+30s[i+31]等变为逗号运算符中的表达式),并且s[i+35]用作{{1的索引本来应该是s

另请注意,s[i+30]和换行符的使用不会消除空格,因此您的格式字符串中间会有许多空白块。

你真的需要重新组织。假设您需要单个函数调用,请考虑:

\

这是残酷的系统性,但允许你生成代码(我应该这样做而不是在Firefox中编辑乱码),更重要的是它可以让你发现不一致。它使用字符串连接来创建格式字符串。

我认为你用循环做得更好 - 十次调用每次迭代打印10个值,甚至100次调用每次迭代打印1个值。

fprintf(bp,
       "%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t"
       "%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t"
       "%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t"
       "%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t"
       "%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t"
       "%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t"
       "%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t"
       "%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t"
       "%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t"
       "%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n",
       s[i+ 0], s[i+ 1], s[i+ 2], s[i+ 3], s[i+ 4], s[i+ 5], s[i+ 6], s[i+ 7], s[i+ 8], s[i+ 9],
       s[i+10], s[i+11], s[i+12], s[i+13], s[i+14], s[i+15], s[i+16], s[i+17], s[i+18], s[i+19],
       s[i+20], s[i+21], s[i+22], s[i+23], s[i+24], s[i+25], s[i+26], s[i+27], s[i+28], s[i+29],
       s[i+30], s[i+31], s[i+32], s[i+33], s[i+34], s[i+35], s[i+36], s[i+37], s[i+38], s[i+39],
       s[i+40], s[i+41], s[i+42], s[i+43], s[i+44], s[i+45], s[i+46], s[i+47], s[i+48], s[i+49],
       s[i+50], s[i+51], s[i+52], s[i+53], s[i+54], s[i+55], s[i+56], s[i+57], s[i+58], s[i+59],
       s[i+60], s[i+61], s[i+62], s[i+63], s[i+64], s[i+65], s[i+66], s[i+67], s[i+68], s[i+69],
       s[i+70], s[i+71], s[i+72], s[i+73], s[i+74], s[i+75], s[i+76], s[i+77], s[i+78], s[i+79],
       s[i+80], s[i+81], s[i+82], s[i+83], s[i+84], s[i+85], s[i+86], s[i+87], s[i+88], s[i+89],
       s[i+90], s[i+91], s[i+92], s[i+93], s[i+94], s[i+95], s[i+96], s[i+97], s[i+98], s[i+99]);

或者:

for (int j = 0; j < 100; j += 10)
{
    fprintf(bp,
           "%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d%c",
           s[i + j + 0], s[i + j + 1], s[i + j + 2], s[i + j + 3], s[i + j + 4],
           s[i + j + 5], s[i + j + 6], s[i + j + 7], s[i + j + 8], s[i + j + 9],
           (j == 90) ? '\n' : '\t');
}

如果有选择,我可能会使用最后一个循环;到目前为止,这是最简单的做法。

我相信这些数据不适合人类消费。一行上有一百个标签分隔的值,这对于人类来说是令人不愉快的阅读。电脑不关心。

上面的代码尚未编译。可能存在错误。