如何在Unix终端中实现C程序的选项?

时间:2013-12-02 16:29:11

标签: c

我想在我的c程序中添加-r选项。因此,当它在终端的命令行中使用时,它将触发我的程序的不同操作。如何告诉我的c程序,当它看到文本-r时,它会跳转到将执行该替换功能的代码片段?

到目前为止我做了什么: 到目前为止,我已经设置了我的c程序来处理文件,但没有选项,所以我的程序能够以这种方式处理文本文件,它以某种方式格式化文本文件并将其打印出stdout:

./ p4.out< sometextfile

./ p4.out sometextfile

来自C by Discovery by Foster我通过使用FILE指针和以下内容找出了如何做到这一点 主程序的形式:

void main(argc, char *argv[])

在我的代码中,我有if语句来指示是否有要处理的输入文件或只是通过以下if语句从标准输入读取:

if(argc == 1){

//do something with standard in (stdin)

}

if(argc == 2){

//do something with one file parameter (sometextfile)

}

我要添加的功能: 特别是我的c程序应该能够采用这样的参数:

./p4.out -r
./p4.out -r sometextfile
./p4.out sometextfile -r

-r功能应该由我的主程序读取,然后指示文本文件中的字符应该颠倒。发现第二版的C没有提到如何为c程序添加选项,所以我不知道该怎么做。

4 个答案:

答案 0 :(得分:2)

您要么计算出特定程序的逻辑,要么使用类似于此处所述的库:http://www.gnu.org/software/libc/manual/html_node/Parsing-Program-Arguments.html#Parsing-Program-Arguments

答案 1 :(得分:2)

您可以通过迭代用户在 argv 数组中提供的参数,将它们与您的参数值进行比较,并设置标志以指示已使用参数来实现此目的。

int reverse = 0;
const char* file = NULL;
for( int i = 1; i < argc; i++ )
{
    if( strcmp( argv[i], "-r" ) == 0 )
    {
        reverse = 1;
    }
    else
    {
        file = argv[i];
    }
}

if( reverse )
{
    // Reverse the text
}
else
{
    // Do something else
}

答案 2 :(得分:2)

取自gnu.org

如果程序的命令行参数的语法足够简单,您可以简单地从argv中手动选择参数。但除非你的程序采用固定数量的参数,或者所有参数都以相同的方式解释(例如文件名),否则通常最好使用getopt(参见Getopt)或argp_parse(参见Argp)进行解析。

答案 3 :(得分:0)

如果您使用cc命令或gcc简单编译程序,则默认情况下可执行文件名为a.out。如果要在编译时删除该文件,可以提供所需的任何名称。第二件事./表示您当前的目录。我不知道如何在不使用./的情况下执行。 可能对你有帮助