【问题标题】:How to pass values through the terminal to a program function如何通过终端将值传递给程序函数
【发布时间】:2018-04-11 21:30:58
【问题描述】:
#include <stdio.h>
void fun_one(int a,int b);
void fun_two(int a,int b);
int main()
{
    printf("Result=");
    return 0;
}

void fun_one(int a,int b){
    printf("%d\n",a+b);
}
void fun_two(int a,int b){
    printf("%d\n",a*b);
}

我是这样编译和运行程序的:

cc exec.c -o exec

./exec

但它没有返回我预期的结果。命令中是否有错误?

输出: 结果=

【问题讨论】:

  • 你的预期输出是什么?
  • 结果=12 或 12
  • 你没有调用任何函数,这就是为什么你只得到函数main()的输出。您调用二进制文件的方式看起来像是要将名为“fun_two”的文件的内容通过管道传输到其中 - 以及两个不相关的数字。请解释你认为你用这种调用程序的方式做了什么。您不是在尝试调用其中一个函数,给它参数,然后期待它的输出,是吗?
  • 如果你想从命令行读取参数,你必须用参数调用 main,如果你想对这些 args 执行数学运算,你需要解析它们。
  • “Result=12”的输出是否可以被称为exec fun_two 3 4?在这种情况下,了解命令行参数和argcargv

标签: c function terminal


【解决方案1】:

您的代码的此编辑显示了如何使用您输入的两个数字来使用您的函数 2。

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


void fun_one(int a,int b);
void fun_two(int a,int b);
int main(int, char **);


int main(int argc, char ** argv)
{
    int a,b;
    a= atoi(argv[1]);
    b=atoi(argv[2]);
    printf("Result=");fun_two(a,b); // similar to what you want from comments

    //using both functions
    printf("a+b=");fun_one(a,b); 
    printf("a*b=");fun_two(a,b); 
    return 0;
}

void fun_one(int a,int b){
    printf("%d\n",a+b);
    return;
}
void fun_two(int a,int b){
    printf("%d\n",a*b);
    return;
}

我已经修改了你的代码,所以如果你编译它

gcc -o exec exec.c 

您将能够运行它

./exec 4 3

要获得所需的输出 - 请注意,我希望使用 cc 进行编译将给出完全相同的输出,但我无法对其进行测试。

我所做的是更改了main 的定义,以便它可以在您调用它时接受输入。额外的位被放入字符串中。

函数atoiascii字符串转换为一个整数数字,这样你在命令行中输入的数字就可以被处理为数字而不是字符串。

请注意,此代码相当脆弱,可能会出现分段。过错。如果你在调用程序后没有输入两个数字,结果将是不可预测的。您可以通过检查 argc 的值来使其更可靠 - 输入命令时在行上键入的内容的数量并检查 atoi 是否有效,但这会使代码更长,我认为更重要的是看到做你现在想要达到的目标的方式。

下面是一个更通用的代码,它允许您选择要在代码中运行的函数....

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


void fun_one(int a,int b);
void fun_two(int a,int b);
int main(int, char **);


int main(int argc, char ** argv)
{
    int a,b;
    a= atoi(argv[2]);
    b=atoi(argv[3]);

    if (!strcmp("fun_one",argv[1])) 
    { 
         printf("Result=");fun_one(a,b); 
    }
    else if (!strcmp("fun_two",argv[1])) 
    { 
         printf("Result=");fun_two(a,b); 
    }
    else printf("Didn't understand function you requested.  \n\n");

    return 0;
}

void fun_one(int a,int b){
    printf("%d\n",a+b);
    return;
}
void fun_two(int a,int b){
    printf("%d\n",a*b);
    return;
}

该函数现在为以下输入提供以下输出

./exec fun_three 3 4
Didn't understand function you requested.  

./exec fun_one 3 4
Result=7
./exec fun_two 3 4
Result=12

所以现在使用上面的代码,您在命令后输入三件事 - 您想要的功能,然后是两个数字 - 如果无法识别该功能,则会出现错误消息。

函数strcmp 比较两个字符串,如果它们相同则返回零。零在逻辑上等于假,因此! 符号用作非,它将零转换为一,将不等于零的数字转换为零。效果是如果两个字符串相同,则逻辑测试为真。

【讨论】:

  • 我很确定 fun_one 不是用来装饰的,并且 OP 想要一个解决方案,它还允许使用参数调用该函数。鉴于此,您的答案似乎只回答了问题的一半或更少。然而,这是一个被接受的回答过程的参与。也许其他人会提供解决方案的其余部分,解析函数名称表单参数并调用核心响应函数。还是您想扩展您的答案以涵盖该内容?
  • @Yunnosch OP 在 cmets 中说预期的答案是 12 - 所以我输入 fun2 并猜测 OP 可能会更改为 fun2 - 但这是一个很好的建议,我会改变
  • 抱歉,只是调用这两个函数,甚至不期望 OP 描述的输入“fun_two”看起来更不像 OP 问题的答案。
  • @Yunnosch - 公平评论 - 我担心添加该功能会使代码变长并使其远离原始代码。 -- 所以现在我添加了第二个代码,其中包括选择使用哪个函数的能力。
  • 不错。但是,请考虑最后一个、最通用的版本是否不是唯一需要的版本,尤其是因为它似乎明显不那么“脆弱”。
猜你喜欢
  • 2021-07-13
  • 1970-01-01
  • 2019-07-09
  • 2012-07-29
  • 2012-09-17
  • 1970-01-01
  • 2015-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多