Can';t接受多个命令行参数并分配给变量

Can';t接受多个命令行参数并分配给变量,c,C,我正在学习C,我不习惯指针和C处理字符串的方式。我正在尝试创建一个程序,该程序接受多个命令行参数并将它们分配给变量,以便以后使用它们。我可以让程序接受第一个参数并将其赋值为int。但是当我尝试接受第二个参数时,我得到了一个分段错误。我尝试过删除第二个变量(服务),然后将端口分配给argv[2]进行测试,但它不起作用。这是关于接受编译器不喜欢的第二个参数,但我无法理解它 #include <stdio.h> int main(int argc, char *argv[]) {

我正在学习C,我不习惯指针和C处理字符串的方式。我正在尝试创建一个程序,该程序接受多个命令行参数并将它们分配给变量,以便以后使用它们。我可以让程序接受第一个参数并将其赋值为int。但是当我尝试接受第二个参数时,我得到了一个分段错误。我尝试过删除第二个变量(服务),然后将端口分配给argv[2]进行测试,但它不起作用。这是关于接受编译器不喜欢的第二个参数,但我无法理解它

#include <stdio.h>

int main(int argc, char *argv[]) {
    int port = atoi(argv[1]);
    char service = argv[2];   
   return 0;
}
#包括
int main(int argc,char*argv[]){
int port=atoi(argv[1]);
char-service=argv[2];
返回0;
}

当您编写
char service=argv[2]时,您正在为字符分配一个字符指针。您知道
argv
是一个字符指针数组,因为您将它定义为
char*argv[]
。只需添加
char*service=argv[2]即可修复

因此,您重写的代码可能如下所示:

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

int main(int argc, char *argv[]) {
    if (argc < 3) {
        printf("Requires more arguments");
        return 1;
    }

    int port = atoi(argv[1]);
    char *service = argv[2];   
    printf("%s", service); //From edit
    return 0;
}
#包括
#包括
int main(int argc,char*argv[]){
如果(argc<3){
printf(“需要更多参数”);
返回1;
}
int port=atoi(argv[1]);
char*service=argv[2];
printf(“%s”,服务);//来自编辑
返回0;
}
您可能需要添加对
argc
(即
argc>=3
)值的检查,因为如果没有三个参数,它将seg fault

编辑(回复评论): 要打印服务,请使用:

printf(“%s”,服务)

%s
指定您将打印一个字符串(
char*
),您只需使用
service
,因为您需要指定指针

编辑2:
如果不添加
#include
,您将收到类似于“警告:C99中的'atoi'隐式声明无效”的消息,这也可能会根据编译器设置产生错误。

。我想我错过了。我只是想做一个printf(“%s”,服务);编译器给了我printf语句的分段错误。就参数而言,argv[0]是文件名。所以我不需要那个部分,只需要用户在运行它时添加的内容。另外,总是比较
if(argc<3){/*handleerror*/}
。您可以使用
!=2
等,但验证参数的可用性。如果愿意,您甚至可以使用连续的三元运算符为每个参数提供默认值。使用这些注意事项更新了我的解决方案BrianJarcus和good addition@DavidC.Rankin谢谢David C.Rankin。我有我的原始代码的那一部分,但我精简了这段代码,使之成为我遇到的问题。马特·古德里奇,我可以打印端口,我的另一个问题是打印服务。这是真的。我还在学习C的工作方式。我更像是一个Python用户,一切都更简单。谢谢你的帮助。