0

我不明白为什么我会因为这么少的代码而出现段错误。我不知道是 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;
}
4

2 回答 2

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

应该:

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

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

于 2013-10-03T00:18:40.543 回答
1

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

  • 检查参数的数量
  • 在 line[] 中为 NULL 终止符分配空间
  • strcmp 成功返回 =0,>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 的使用比使用 0 和一些非零值(如 1 或 -1)更便于移植(对于非 UNIX 环境)。*

于 2013-10-03T02:14:23.477 回答