2013-04-13 48 views
0
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#define MAXLINE 512 
main(int argc,char* argv[]){ 
    FILE *fi; 
    fi=open(argv[1],"r"); 
    char linie[MAXLINE],*p; 
    for (; ;) { 
     p = fgets(linie, MAXLINE, fi); 
     linie[MAXLINE-1] = '\0'; 
     printf("%s", linie); 
    } 
    fclose(fi); 

}; 

你好, 我有这样的代码,基本上就是我想要做的是打印在命令行参数给出文件创建一个C源,可能有人请告诉我为什么我得到一个分割11错? 谢谢分段故障11

+0

你可以检查*,其中*你得到一个分段错误?这可以通过例如查看来自'valgrind。/ yourprogram'的痕迹来完成。 –

+0

那么这个循环看起来有点可疑。 – austin

+1

也许你的'fi = open(argv [1],“r”);'产生了一个NULL文件指针? @austin:是的循环是可疑的,但它只会循环,而不是崩溃。 – wildplasser

回答

8
  1. 您的for循环未结束。
  2. 您不检查fgets的结果,在达到文件结尾时给出NULL。你也不会检查fopen的结果,当文件无法打开时它给出NULL
  3. 你不检查argc是否至少2使用argv[1]
  4. 之前,您正在使用的open代替fopen

提示:如果您使用的GCC使用-Wall -pedantic

3

你打电话open()你可能打算拨打fopen()。你不应该忽略编译器警告。

另外,您应该检查返回值fopen()以确保它不是NULL

+0

谢谢,但编译器确实显示任何错误 – JackRobinson

+0

你没有得到一个“没有强制转换使整数指针从整数”警告? – Sebivor

+0

不,我的编译器没有给我任何警告或错误... – JackRobinson

1

的固定版本:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#define MAXLINE 512 
main(int argc,char* argv[]){ 
    FILE *fi; 
    if (argc < 2) 
     return; 
    fi=fopen(argv[1], "r"); 
    if (!fi) 
     return; 
    char linie[MAXLINE],*p; 
    for (; ;) { 
     p = fgets(linie, MAXLINE, fi); 
     if (p == NULL) 
      break; 
     linie[MAXLINE-1] = '\0'; 
     printf("%s", linie); 
    } 
    fclose(fi); 
}; 
+1

Neato。让我们都避免这个问题(“为什么会段错误?”)和勺子喂人,因为这会阻止学生来到这里并要求我们去做工作......。这已经是我们的问题了。请尝试帮助,而不是*为他们做这一切*。 – Sebivor