为什么我会遇到seg错误(strcmp或fgets)?

时间:2013-10-03 00:16:48

标签: c string file-io fgets strcmp

我不明白为什么我会用这么少量的代码得到一个段错误。我不知道是strcmp还是fgets这是导致问题的原因。我已经和他一起工作了两天,原谅我的沮丧。

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

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

FILE* input;
char line[40];


    printf("%s\n", argv[1]);
    if ((strcmp(argv[1], "-f")) == 1)
    {           
        printf("Inside first if statement\n");          
        input = fopen(argv[2], "r");
        if(input == NULL)           
        {
            printf("Could not open file\n");
            exit(-1);
        }
    }
    while ((fgets(line, 40, input)) != NULL)
        {
        //printf("%s\n", input_line);
        }

return 0;
}

2 个答案:

答案 0 :(得分:4)

if ((strcmp(argv[1], "-f")) == 1)

应该是:

if (strcmp(argv[1], "-f") == 0)

...您可能想先阅读文档。请参阅strcmpfgets

答案 1 :(得分:1)

您可能需要执行以下操作:

  • 检查参数数量
  • 在行[]中为NULL-terminator
  • 分配空间
  • strcmp在成功时返回= 0,&gt; 0不匹配的位置
  • perl有'chomp',您可以复制它以删除额外的“\ n”

这是您的代码,已修订并正常工作

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

int usage()
{
    printf("usage: %s -f <file>\n",argv[0]);
}

int main(int argc, char* argv[])
{
    FILE* input;
    char line[+1]; //allow room for NULL terminator

    if (argc < 3 || strcmp(argv[1], "-f") ) { usage(); exit(1); }
    printf("file: %s\n", argv[2]);
    if( (input = fopen(argv[2], "r")) == NULL)
    {
        printf("open %s\n",argv[2]);
        exit(2);
    }
    //ask C how big line[] is
    while ( fgets(line, sizeof(line), input) != NULL )
    {
        //line[sizeof(line)-1] = '\0'; //fgets does this for us
        printf("%s\n", line);
    }
    return 0;
}

顺便说一句:* EXIT_SUCCESS和EXIT_FAILURE的使用稍微便宜一些 非UNIX环境)比使用0和一些非零值(如1) 或-1。*