【问题标题】:Command line argument in C causing segmentaion fault?C中的命令行参数导致分段错误?
【发布时间】:2015-01-18 12:36:16
【问题描述】:

我想写一个简单的程序把我们传给它的命令行参数打印回终端

我通常用 Java 编程,它完全可以编写

public class cmdargs
{
public static void main(String[] args)
{
if(args.length>0)
System.out.println(args[0]);
}
}//class ends

现在在C 中,我能找到的最接近String 的是char[] 或者更确切地说是char name[]

所以当我写的时候

#include<stdio.h>
int main(char args[])
{
printf("%s",args);
return 0;
}

为什么会出现分段错误?

./cmdargs hi
Segmentation fault (core dumped)

【问题讨论】:

  • 注意:java != C.

标签: java c string segmentation-fault command-line-arguments


【解决方案1】:

因为这个签名是错误的

int main(char args[])

在c中,参数个数作为第一个参数传递,参数作为指针数组传递,所以正确的签名应该是

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

然后您可以访问这些值,例如

int i;

for (i = 0 ; i < argc ; ++i)
    printf("%s\n", argv[i]);

请启用编译器警告,以防止此类程序编译。

【讨论】:

  • 谢谢,但为什么要使用 char *argv[] 而不是 char argv[] 来接收我想的许多 args,(对不起,我很讨厌指针)
  • char argv[]char 的数组。 char 代表单个字符而不是字符串,c 中字符串的概念与 Java 有很大不同。 char *argv[] 是一个字符指针数组,实际上也可以写成char **argv。 char 指针,是指向char 类型数据的指针,当它由以'\0' 字节终止的字节序列组成时,被视为字符串。
  • 谢谢我改成了` int main(int arg, char *args[]) { printf("%s",args[0]); ` ./cmdargs hello 不打印任何东西?
  • 它应该打印程序名称。即使您不向程序传递任何参数,也应该可以。您能否告诉我您是否使用任何特定的 IDE 或类似的东西。
  • 不只是 Ubuntu 中的 vi 并从终端运行
猜你喜欢
  • 2014-03-22
  • 1970-01-01
  • 2017-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-19
  • 2015-07-29
  • 1970-01-01
相关资源
最近更新 更多