1

我是 C 的新手,正在尝试编写一个计算括号、大括号、空格和换行符的程序。编译器发出错误:Error opening fileSegmentation fault (core dumped)

#include <stdio.h>


int main(int argc, char *argv[])
 {
    FILE *fp;
    char c;
    int blank, tab, openbrace, closedbrace,openbracket,closedbracket, newline=0;


if ((fp = fopen("argv[0]", "r")) == NULL)
   {
     fprintf(stderr, "Error opening file");
    }
 while ((c=fgetc(fp)) != EOF)
 {
switch(c)
    {

        case '{':
        openbrace++;

        case '}':
        closedbrace++;

        case '[':
        openbracket++;

        case ']':
        closedbracket++;

        case '\n':
        newline++;


     }
   }
fclose(fp);
printf("\nThe number of { are %d", openbrace);
printf("\nThe number of } are %d", closedbrace);
printf("\nThe number of [ are %d", openbracket);
printf("\nThe number of ] are %d", closedbracket);
printf("\nThe number of new lines are %d", newline);
}
4

3 回答 3

2

有几件事:

1)错误情况后立即退出 - 不要继续。

2)打开 argv 1,而不是 "argv[0]" (argv[0] 包含可执行文件名称,并且您将其包含在字符串中)

fopen(argv[1], "r")

argv[1]通过检查来确保存在可能是一个好主意argc

于 2013-10-16T01:01:12.827 回答
0

当您打印出错误时,您需要退出程序。相反,无论如何你都会进入while循环。因为fpis null,所以它崩溃了。

于 2013-10-16T01:00:26.510 回答
0

问题是这一行:

if ((fp = fopen(argv[0], "r")) == NULL)

argv[0]是您想要的程序的名称,argv[1]它是第一个用户字符串。

所以应该是这样的:

if ((fp = fopen(argv[1], "r")) == NULL)
于 2013-10-16T01:01:52.133 回答