C - 在system()函数内部循环的正确方法是什么?

时间:2013-05-13 09:03:17

标签: c bash

我使用pcdtojpeg解决方案将一些旧的.pcd图像转换为jpeg。由于我有很多图片,我正在编写一个C程序来自动化该过程。 我有适度的C#经验,但对C来说还是新手。

以下是我目前使用的一些占位符魔术数据

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

int main(int argc, char *argv[])
{
int i=0;

for (i=0; i<90; i++)
{

    if(i<10)
    {       
    system("sudo ./pcdtojpeg img000%d.pcd", i);
    }

    else
    {
    system("sudo ./pcdtojpeg img00%d.pcd", i);
    }
}

return 0;
}

编译器输出一个错误,定义了太多参数给系统函数,因为它可能不会占用任何参数。

我已经在网上搜索了大量的文档,例如cplusplus.com和linux.die.net,但是没有找到任何答案如何正确迭代C中的system()函数。

我正在运行

  

GCC 4.8.0

     

Linux 3.9.2-1-ARCH#1 SMP PREEMPT x86_64 GNU / Linux

2 个答案:

答案 0 :(得分:4)

您不想“在system()内进行迭代”。您想要做的是迭代围绕 system(),以便您多次调用它。你的代码已经这样做了。缺少的部分是如何在每次调用时格式化命令。

为此,您应该使用snprintf()

char buf[1024];

snprintf(buf, sizeof buf, "sudo ./pcdtojpeg img%03d.pcd", i);
system(buf);

使用% - 代码来格式化字符串的过程不是像你的代码所期望的那样内置在C语言中的东西。它只是由一组(库)函数实现的约定,如printf()snprintf()

%03d格式代码表示“从int插入一个十进制数字,并在左侧使用零填充它,使宽度变为3位数,总数”。因此,不需要if

答案 1 :(得分:4)

在这里借调Maxim Skurydin的评论。

你的C代码是一个简单的循环围绕shell调用

在这种情况下,C是错误的技术。请改为使用shell脚本,并丢失sudo,因为除了系统管理目的,您从不必须使用它:

for id in $(seq -f %04.f 0 89)
do
    ./pcdtojpeg img${id}.pcd
done

更快完成,很多在必要时更容易理解和更新。

(如果您想要触摸的文件可以使用模式匹配ls收集,那么ShinTakezou确实打败了我更简单的解决方案。)