【问题标题】:Calling executable file inside C program在C程序中调用可执行文件
【发布时间】:2011-03-19 14:10:31
【问题描述】:

我有一个 C 程序,它将一个参数作为输入,如果参数与可执行文件中的字符串匹配,它将返回 1,否则返回 0。可执行文件名为 prg1。我在一个名为inputs.txt 的文件中有一些输入字符串。我想从输入文件中获取这些字符串,并在 C 程序中使用每个字符串调用 prg1

我已经尝试了以下代码,但它不起作用。没有分段错误,但是当我调用 prg1 时它会执行,因为 prg1 中的 printf() 语句正在工作,我可以看到输出。它将发现的变量更改为0我不能改变prg1。因为我朋友给了我那个程序的可执行文件,而不是源代码。头文件是stdio.h和string.h

int main()
{
    FILE *fk;
    char text[80],inp[16],test[50]={"./prg1 "};
    int found=100;
    fk=fopen("inputs.txt","r");
    while((fscanf(fk,"%s",inp))!=EOF)
    {
        strcat(test,inp);
        found=system(test);
        if(found==1)
        {
            printf("\nAnswer is   : %s",inp);
            break;
        }
            strcpy(test,"./prg1 ");

    }
    fclose(fk);
    return 0;
}

我的代码有什么问题?

【问题讨论】:

  • 请下次包含您已包含的库,以及具体的错误消息。对于其他人:一旦编译并运行它就会以Segmentation Fault 退出。 edit 哎呀,如果你没有inputs.txt。确保在测试时这样做!

标签: c


【解决方案1】:

我不确定您想要实现什么,但这里有一些 cmets:

1 - 你应该测试 fopen 的返回值:

if (!fk) { ... }

2 - 您没有在每次测试之间清理 test 缓冲区,因此您实际上是在调用:

system("prg1 first_word");
system("prg1 first_wordsecond_word");
...

你应该有类似的东西:

strcpy(test, "prg1 ");

进入循环之后和strcat之前。

3 - 你的输入字符串中有空格吗?在这种情况下,您应该修复您的代码以读取直到换行。

4 - 您可能想要使用 EXIT_SUCCESSEXIT_FAILURE 而不是 0 和 1。

【讨论】:

    【解决方案2】:

    prog1 在找到匹配项时返回 1,但 1 代表错误(至少在 linux 系统中)。尝试返回EXIT_SUCCESSEXIT_FAILURE(在stdlib.h 中定义)。然后,当system() 调用返回0 时,找到匹配项,否则,找不到匹配项。

    【讨论】:

      【解决方案3】:

      您的代码中的根本缺陷是您需要在主循环的每次迭代开始时将“test”数组的内容重置为“prg1”,然后再调用 strcat 将下一个参数添加到命令行。否则,要运行的命令将随着每次迭代而继续变长,因为每个输入读取都会添加到现有命令中。我不认为那是你想要的。

      例如,给定两行输入,“foo”和“bar”,循环的第一次迭代将导致命令“prg1 foo”被执行,而第二次将导致“prg1 foobar”被执行.一个简单的检查方法是在调用 system() 之前插入一个 printf (或类似的)来显示将要执行的命令。

      您还应该检查 fopen 的返回码并在使用 fscanf 分配给数组时检查数组边界。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-13
        • 2022-01-12
        • 1970-01-01
        • 1970-01-01
        • 2022-01-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多