比较C中的字符串文字命令行参数

时间:2014-09-27 16:27:13

标签: c linux parameter-passing

我需要我的程序以./src c 2345 or ./src s 345的方式运行,其中第一个字符h是c或s,第二个是整数。如果有任何较少的参数以及c或s以外的任何字符,程序应该抛出一个使用错误。这是我的代码

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

    int num_of_connections = 0, client_sockfd;
    int max_sockfd, master_socket;

    fd_set socket_collection, read_collection;

    // Check validity of the user input
    if(argc < 3) {
        if((strcmp(argv[2], "s") != 0) || (strcmp(argv[2], "c") != 0)){
            fprintf(stderr, "Usage: ./src <s/c> <port>\n");
            exit(EXIT_FAILURE);
        }

    }

当我输入一个参数时,我会遇到分段错误。它也不识别C或S参数。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

如果您只想要两个参数,那么

if(argc < 3) {没有意义。在内部if区块中,您会混淆||(逻辑或)与&&(逻辑和)。

在您的调用示例./src s 345中,该字符是第一个参数,因此argv[2]可能应该读取argv[1]

if ((argc != 3) || ((strcmp(argv[1], "s") != 0) &&
                    (strcmp(argv[1], "c") != 0))) {
    fprintf(…);
    return EXIT_FAILURE;
}

注意:由于C的运算符优先级,此if (…)条件中的所有括号都是可选的。我把它们放在可读性中。

答案 1 :(得分:1)

请注意main有一个非常具体的约定:argv数组有argc+1个成员,最后一个是NULL,其他是非空的不同指针零终止字符串。

因此,如果argc为1(例如,如果您单独运行./src)或2,argv[2]NULL并且您无法将其传递给strcmp < / p>

strcmp(argv[2],"s")

时,您只能致电argc>=3

顺便说一下,我建议使用getopt(3)或者最好(仅限Linux)getopt_long并接受每个GNU conventions --help--version个参数}。

此外,使用所有警告和调试信息(gcc -Wall -g)进行编译并使用gdb调试器。使用gdb比在这里询问并等待回复更快。