我需要我的程序以./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参数。任何帮助将不胜感激。
答案 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
比在这里询问并等待回复更快。