0

我可能以完全错误的方式执行此操作,但考虑到这将是供个人使用的,因此效率不高是可以的。

当运行为 时./todo -r,它可以工作。

当运行为 时./todo -a,它可以工作。

当运行为时./todo,它给了我segmentation fault (core dumped)

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

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

    if(argc < 1) {
    printf("Not enough variables.");
    }

    if(strcmp("-r",argv[1])==0) {
        printf("\n");

        system("cat .todo");
        printf("\n");
    }
    if(strcmp("-a",argv[1])==0)   {
    char str[BUFSIZ];
    FILE *f;
    f = fopen(".todo","a");
    printf("\n\nTODO list\n\n");
    for(;;) {

        printf("~ ");
        fgets(str,256,stdin);
        if(strcmp(str,"\n")==0) {
            fclose(f);
            printf("\n");
            break;
        }

        fprintf(f,str);
        }
    return 0;
    }
}
4

3 回答 3

2

argv[0]是程序可执行名称,它被计入argc.

./todo也有argc=1,但为 NULL,这argv[1]将导致strcmp().

argv[argc] ==?

改变你的测试: -

if (argc < 2) 
{
  printf("Not enough variables.");
  return 0; // do this, otherwise we'll plough straight on..
}
于 2013-10-21T20:09:19.277 回答
1

正如其他人指出的那样,您需要argc < 2而不是argc < 1.

此外,您可能希望从 , 返回if以阻止其余部分执行:

if(argc < 2) {
  printf("Not enough variables.");
  return /* some appropriate value here */;
}
于 2013-10-21T20:11:20.300 回答
0

您正在关闭文件句柄,然后仍在尝试写入它:

if (...) {
   fclose(...); <--potentially closing it, depending on the if() results
}
fprintf(...); <--potentially writing to a closed handle.

这是一个坏主意。

于 2013-10-21T20:09:31.380 回答