Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
运行我的C程序时在Linux中遇到分段错误_C_Linux_Simulation - Fatal编程技术网

运行我的C程序时在Linux中遇到分段错误

运行我的C程序时在Linux中遇到分段错误,c,linux,simulation,C,Linux,Simulation,我正在尝试模拟中的命令。当我运行我的程序时,我得到了一个很好的结果 例如: ./a.out a > b a包含hello。我希望在b中复制hello 我的代码如下: #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> #include <string.h> int

我正在尝试模拟中的命令。当我运行我的程序时,我得到了一个很好的结果

例如:

./a.out a > b
a
包含hello。我希望在
b
中复制hello

我的代码如下:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>

int main(int argc,char *argv[])
{
    int f, fd, r;
    char buf[100];

    if (argc < 2)
    {
        printf("Error");
        return 0;
    }
    else
    {
        if (!strcmp(argv[2],">"))
        {
            f = open(argv[1],0,00777);

            if (f == -1)
                printf("no file");
            else
            {
                fd = creat(argv[3],00777);
                while( (r = read(f,buf,50)) > 0)
                    write(fd, buf, r);
            }
        }
    }
    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
int f,fd,r;
char-buf[100];
如果(argc<2)
{
printf(“错误”);
返回0;
}
其他的
{
如果(!strcmp(argv[2],“>”))
{
f=打开(argv[1],000777);
如果(f==-1)
printf(“无文件”);
其他的
{
fd=creat(argv[3],00777);
而((r=read(f,buf,50))>0)
写入(fd、buf、r);
}
}
}
返回0;
}
为什么会出现分段错误


我有一个类似的程序,我以同样的方式打开并创建文件,该程序正在运行,但这一个给了我一个分段错误。

这可能是因为重定向由shell而不是您的程序处理,所以
argv[2]
NULL
并且
argv[3]
不存在


但是,您应该使用调试器来找出真正发生的事情。然后添加正确的错误检查。

这可能是因为重定向是由shell处理的,而不是由程序处理的,因此
argv[2]
NULL
并且
argv[3]
不存在


但是,您应该使用调试器来找出真正发生的事情。然后添加正确的错误检查。

您可以在这里不使用
gdb
但您必须开始以结构化的方式解决问题:

  • 不要认为任何事情都是理所当然的。例如,即使您将程序称为
    program>file
    ,也不要假定
    argv
    与您假定的外观相同,而是通过输出每个参数来检查:

    printf("argc: %d\n", argc);
    printf("argv[0]: %s\n", argv[0]);
    printf("argv[1]: %s\n", argv[1]);
    printf("argv[2]: %s\n", argv[2]);
    printf("argv[3]: %s\n", argv[3]);
    // the se can be expressed better with a for loop - but I'll leave that as an exercise for you
    
  • 仅将您已验证的内容视为理所当然:如果您知道
    argc>=2
    ,请不要访问
    argv[2]
    和/或
    argv[3]

  • 别说

    if(argc<2)
    {
        printf("Error");
        return 0;
    }
    

    if(argc在这里,你可以不用
    gdb
    生活-但你必须开始以结构化的方式解决问题:

    • 不要认为任何事情都是理所当然的。例如,即使您将您的程序称为
      program>文件
      ,也不要假设
      argv
      看起来与您假设的一样,而是通过输出它们中的每一个来检查:

      printf("argc: %d\n", argc);
      printf("argv[0]: %s\n", argv[0]);
      printf("argv[1]: %s\n", argv[1]);
      printf("argv[2]: %s\n", argv[2]);
      printf("argv[3]: %s\n", argv[3]);
      // the se can be expressed better with a for loop - but I'll leave that as an exercise for you
      
    • 仅将您已验证的内容视为理所当然:如果您知道
      argc>=2
      ,请不要访问
      argv[2]
      和/或
      argv[3]

    • 别说

      if(argc<2)
      {
          printf("Error");
          return 0;
      }
      

      如果(argcJoachim Pileborg的答案显然是正确的,那么就试着按照

      ./a.out a \> b
      

      为了防止shell将“>”解释为重定向。
      Joachim Pileborg的回答显然是正确的,只需将程序作为重定向运行即可

      ./a.out a \> b
      


      防止shell解释“>”作为重定向。

      gdb
      发明的众多原因之一。@WhozCraig-现在,如果他们能够继续讨论gdb需要改进并变得更可用和友好的众多原因之一的话。不要浪费时间手工格式化代码;使用计算机程序。@Duck所有主要的IDE都对gdb有很好的支持,包括visual h处理调用堆栈和变量。然后在编译命令行args上结合使用
      gdb
      -g
      将非常方便。发明
      gdb
      的众多原因之一。@WhozCraig-现在,如果他们能继续讨论gdb需要改进的众多原因之一,并且变得更可用和友好。不要浪费时间你的生活手工格式化代码;使用计算机程序。@Duck所有主要IDE都非常支持GDB,包括调用堆栈和变量的可视化处理。然后,
      GDB
      与编译命令行args上的
      -g
      结合使用将非常方便。+1了解标准说明
      argv[argc]
      保证为空(您可能不会惊讶于它被解释为未定义的频率)1.我一周前做了一个类似的程序,效果很好only@ashwinbhy然后它可能会工作,因为它是相似的。重定向和管道总是由shell处理。这几乎是一样的。在这里,我只检查我为“>>”制作的另一个程序中的一个条件等等。它在同一台电脑上运行良好。现在我正在比较两者。我使用了完全相同的东西,但这个程序不工作。实际上我不知道如何使用调试器。我对linux非常陌生。在明天的测试之前,我必须再执行20个程序,所以我暂时不谈这个问题。+1因为知道标准规定
      argv[argc]
      保证为空(您可能不会感到惊讶的是,这被解释为未定义的频率有多高)1.我一周前做了一个类似的程序,效果很好only@ashwinbhy然后它可能会工作,因为它是相似的。重定向和管道总是由shell处理。这几乎是一样的。在这里,我只检查我为“>>”制作的另一个程序中的一个条件等等,它在同一台电脑上运行良好,现在我正在比较两者,我使用了完全相同的东西,但这个程序不工作,实际上我不知道如何使用调试器,我对linux非常陌生。我明天测试之前还要执行20多个程序,所以我现在就把它放在一边。我在想同样的事情,一个程序,这个简单的gdb,是杀伤力过大的,一些quick prints将隔离问题。我也在想同样的事情,一个程序这个简单的gdb是杀伤力过大的,几个快速打印将隔离问题。谢谢这项工作。我无法反驳我在早期的程序中给出的。/a.out a>b它在该程序中工作正常。但不在这个程序中,不是很奇怪吗。你的程序仍然是错误的,就像其他程序一样已经说过,在argc测试中。如果你想访问