将 string/integer 的命令行参数解析为标准输出

Parsing command line arguments for string/integer to stdout

可以使用命令行参数调用程序。例如,程序 printargs 可能被称为 ./printargs -a2 -b4.

我想实现一个程序,它以任意顺序接受整数 A 和 B 的两个参数 -aA 和 -bB,即 -aA -bB 和 -bB -aA 在调用程序和转换 A 时都是合法参数和 B 为整数,并写入 stdout/terminal 行“A is (INSERT A) and B is (INSERT B)”。

例如调用

printargs -a2 -b4 或

printargs -b4 -a2 应该输出

A是2,B是4

我觉得有一些进步,我写了下面的代码:

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

int main( int argc, char *argv[])
{


int a,b;

a = atoi(argv[0]);
b = atoi(argv[1]);

printf("A is  %d and B is %d\n",a,b);

return 0;

}

我在终端中得到了输出——这当然是不正确的。

A is  0 and B is 0

当 运行 code/command

./print -a2 -b4

在终端

谁能帮帮我?

提前致谢

当你这样做时

$ ./print -a2 -b4

你有

argc == 3
argv[0] ==> "./print"
argv[1] ==> "-a2"
argv[2] ==> "-b4"
argv[3] == NULL

要将 "-a2" 转换为整数 2,您需要忽略前 2 个字符。

int a = atoi("-a2" + 2); // same as atoi("2")

当然,在您的情况下,您需要在参数中确定 'a''b'(可能还有 '-')...

sscanf可用于解析参数。
检查 argc 是否为 3。
这将适用于 ./printargs -a3 -b45./printargs -b45 -a3

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

int main ( int argc, char *argv[])
{
    int a = 0;
    int b = 0;
    int j = 0;

    if ( argc != 3) {
        fprintf ( stderr, "Useage;\n\t%s -ax -by\n", argv[0]);
        return 1;
    }

    for ( j = 1; j < argc; ++j) {
        sscanf ( argv[j], "-a%d", &a);
        sscanf ( argv[j], "-b%d", &b);
    }

    printf ( "A is  %d and B is %d\n", a, b);

    return 0;
}

来自 C 标准(5.1.2.2.1 程序启动,p.#2)

If the value of argc is greater than zero, the string pointed to by argv[0] represents the program name; argv[0][0] shall be the null character if the program name is not available from the host environment. If the value of argc is greater than one, the strings pointed to by argv[1] through argv[argc-1] represent the program parameters.

也就是说,如果您指定了参数 -aA 和 -bB,那么它们将按照程序启动时指定的顺序存储在 argv[1]argv[2] 中。在这种情况下 argc 将等于 3.

因此这些陈述

a = atoi(argv[0]);
b = atoi(argv[1]);

不过就算你会写成这样

a = atoi(argv[1]);
b = atoi(argv[2]);

尽管如此,此语句还是不正确的,因为您需要使用偏移量来跳过前缀 -a-b.

正如您自己编写的那样,可以按任何顺序指定参数。

程序可以这样看

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

int main( int argc, char * argv[] ) 
{
    enum { N = 3 };
    const char prefix[][N] = { "-a", "-b" };
    
    int valid = argc == 3;
    
    if ( valid )
    {
        valid = ( memcmp( argv[1], prefix[0], N - 1 ) == 0   && 
                  memcmp( argv[2], prefix[1], N - 1 ) == 0 ) ||
                ( memcmp( argv[1], prefix[1], N - 1 ) == 0   &&
                  memcmp( argv[2], prefix[0], N - 1 ) == 0 );
    }
    
    if ( !valid )
    {
        fputs( "Invalid format of the command line.\n", stderr );
        fprintf ( stderr, "Usage\t%s -aA -bB\n", argv[0] );
        fprintf ( stderr, "   or\t%s -bB -aA\n", argv[0] );
        
        return 0;
    }
    
    int a = 0, b = 0;
    
    if ( memcmp( argv[1], prefix[0], N - 1 ) == 0 )
    {
        a = atoi( argv[1] + N - 1 );
        b = atoi( argv[2] + N - 1 );
    }
    else
    {
        a = atoi( argv[2] + N - 1 );
        b = atoi( argv[1] + N - 1 );
    }
    
    printf("A is %d and B is %d\n", a, b );
    
    return 0;
}