【问题标题】:How to call a function in another C file with a subset of the command-line arguments?如何使用命令行参数的子集调用另一个 C 文件中的函数?
【发布时间】:2021-09-03 21:43:54
【问题描述】:

如何使用命令行调用此convert 函数并从参数 2 开始将字符串转换为 int 并存储在数组中?

#include <stdio.h>

int main (int argc , char* argv[])
{
    int i;
 
    if (argc < 2)

    {
        printf("Error: Less than two arguments\n");
    }
    else 
    {
        for(i=0; i<argc; i++)
        {
            printf("[%d] : %s\n", i , argv[i]); 
        }
    }
    return 0;
} 

函数在同一目录但在单独的 C 文件中:

void convert ( char* parray[] ,int array[] )
{   
    int i;
 
    printf("The converted array = ");

    for (i=0; i< LENGTH; i++)
    {
        array[i] = atoi(parray[i]);

        printf(" %d" , array[i]);
    }
    printf("\n");
}

【问题讨论】:

  • OT:函数atoi()在发生错误时不会通知程序。建议使用strtol()

标签: c command-line-arguments


【解决方案1】:

您可以将两个文件编译成同一个可执行文件,例如:

gcc -o main main.c convert.c

要在main.c 中使用convert.c 中的函数,您必须在定义main() 函数之前声明该函数,如下所示:

#include<stdio.h>

void convert ( char* parray[] ,int array[] );

int main (int argc , char* argv[])
{
    // your code ..

    //you may now use the convert function inside the main function
    convert(param1, param2);
}

或者,您可以为convert.c 创建一个名为convert.h 的头文件,如下所示:

#ifndef CONVERT_H
#define CONVERT_H

void convert ( char* parray[] ,int array[] );

#endif

然后,您可以像这样在主文件中包含头文件:

#include<stdio.h>
#include "convert.h"

int main (int argc , char* argv[])
{
    // use convert here somewhere
    convert(param1, param2);
}

【讨论】:

    【解决方案2】:

    创建一个模块,将声明放在单独的文件中,将实现放在单独的文件中。

    functions.h:

    #ifndef FUNCTIONS_H /* include guard */
    #define FUNCTIONS_H
    
    void convert(char *parray[], int array[], int length);
    
    #endif
    

    functions.c:

    #include "functions.h" /* include your header with the declarations */
    #include <stdio.h>
    #include <stdlib.h>
    
    void convert(char *parray[], int array[], int length)
    {
    
        int i;
    
        printf("The converted array = ");
    
        for (i = 0; i < length; i++)
        {
            array[i] = atoi(parray[i]);
    
            printf(" %d", array[i]);
        }
        printf("\n");
    
        return;
    }
    

    ma​​in.c:

    #include "functions.h"
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
        int i, *arr = NULL;
    
        if (argc < 2)
        {
            printf("Error: Less than two arguments\n");
        }
        else
        {
            arr = malloc((argc - 1) * sizeof(int)); /* array can be static too */
    
            if (arr == NULL)
            {
                exit(EXIT_FAILURE);
                /* handle error */
            }
    
            convert(&argv[1], arr, argc - 1);
    
            free(arr); /* free when you exit */
        }
    
        return 0;
    }
    

    编译:

    clang -c functions.c &amp;&amp; clang main.c functions.o

    clang functions.c main.c

    输出:

    $ ./a.out 15 20 -90 18 20 20 8 8 8 81
    $ The converted array =  15 20 -90 18 20 20 8 8 8 81
    

    【讨论】:

    • 如果我们想要一个静态数组并从参数 2 开始转换而不是参数 1 怎么办!亚历克斯先生?
    • 那么在这种情况下,您将需要编辑函数调用。 convert(&amp;argv[2], arr, argc - 2);arr 不需要更改。即使你选择静态。
    • @Anas 然后只需修改 *arr -> arr[SIZE] 并删除 malloc()free() 调用。 SIZE 是所需的大小。
    猜你喜欢
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 2016-01-18
    • 2017-01-08
    • 2020-03-09
    • 2019-09-09
    • 2021-12-20
    • 1970-01-01
    相关资源
    最近更新 更多