如何修复sprintf错误

时间:2015-06-30 20:21:06

标签: c linux

如果我在底部评论sprintf行

,下面的代码就可以了
int doStepOneAndTwo(){
FILE *fp, *source, *target, *fp1; 
   PROT prot;
   int i, j;
   int k, counter;
   int n_conf;
   int number_of_dir;
   int number_of_line;
   char sbuff[256];
   char str[256];
   char str1[256];
   int ch;
   const char *a[5];

   number_of_line = 140;
   number_of_dir = ceil( number_of_line /30) + 1;
   a[0] = "submit.sh";
   a[1] = FN_RUNPRM;   // run.prm
   a[2] = env.rename_rules; // name.txt
   a[3] = env.inpdb; // prot.pdb
   a[4] = STEP2_OUT; // step2_out.pdb

   for (i=1; i<=number_of_dir; i++)
    {

      sprintf(str,"_%d", i);
      mkdir(str,"0755"); // Create temporary directories

      for (j=0;j<5;j++)
      {
          sprintf(str,"%s", a[j]);
          source = fopen(str, "r");
          if( source == NULL ) 
            {
                printf("Error in doStepOneAndTwo, can't open file source \n");
                return USERERR;
            }
          sprintf(str,"_%d/%s", i, a[j]);
          target = fopen(str, "w");
          if( target == NULL ) 
            {
                fclose(source);
                printf("Error in doStepOneAndTwo, can't open file target %s \n",str);
                return USERERR;
            }


          while( (ch = fgetc(source)) != EOF) {
              fputc(ch, target);
          }

          //if(k!=1){printf("foo");}else{printf("bar \n");}
          //k++;

      }

    }
    fclose(source);
    fclose(target);

for (k=1; k<2; k++)
    {
        printf("Yes %d \n",k);

        sprintf(str1,"_%d/run.prm",k); // If I comment this line everything works just fine 
        //chdir("_1");
        fp1=fopen(FN_RUNPRM, "r");
    }

return 0;

}

我得到的错误是#34; doStepOneAndTwo出错,无法打开文件目标_1 / submit.sh&#34; 。基本上,目标文件是NULL。我是c的新手,不知道自己做错了什么。

1 个答案:

答案 0 :(得分:2)

我发现很难相信评论sprintf()会使该计划适合您。这样做并不适合我。

主要问题似乎出现在mkdir()来电中。传递给该系统调用的文件模式应该是一个整数(特别是mode_t)模式,但是您传递一个指针,转换为整数。这并不意味着你想要什么。在我的特定情况下,目录的结果模式不能提供所有者写入权限,从而导致您描述的错误消息。

此替代mkdir()调用确实可以让您的计划为我工作,无论是否引用了sprintf()

mkdir(str, 0755);

请注意,未加引号的 0755是一个八进制(基数为8)的字面值,因为从数字0开始而不是十六进制文字。不过这样写它会更常规:

mkdir(str, S_IRWXU | S_IRGRP | SIXGRP | S_IROTH | S_IXOTH);

您可能需要包含sys/types.hsys/stat.hfcntl.h中的一个或多个来获取模式宏的定义。