c语言seg的作用,理解scanf()的用C(SEG故障)

我不理解C.获得输入我有以下代码被产生分段故障:理解scanf()的用C(SEG故障)

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

while (fgets(buffer, MAX_LEN + 1, input) != NULL) {

get_command(t, buffer);

}

return 0;

}

static void get_command(Table *t, char *command) {

COMMAND command_name = 0;

char *valid_args_str[] = {"aa","bb"};

int arg_counter = 1;

scanf("%s", command);

if (!strncmp(command, "in", 2)) {

command_name = INSERT;

while(arg_counter){

printf("whileloop reached, arg_counter is %d", arg_counter);

scanf("%s", valid_args_str[arg_counter - 1]);

}

.

.

.

}

我得到分段错误之前,print语句甚至没有被评估。这是怎么回事?

什么是while (fgets(buffer, MAX_LEN + 1, input) != NULL)在做什么? scanf()在做什么?我可以有一个scanf()跟着另一个?我意图争辩是在同一条线上。

谢谢!

更新:

这是更新的代码。仍是同样的问题。希望这将是一个更完整的片段:

typedef enum { INSERT = 1, SEARCH, DELETE, RESET, DISPLAY} COMMAND;

static void get_command(Table *t, char *command) {

COMMAND command_name = 0;

char valid_args_str[] = {"aa","bb"};

int arg_counter = 0;

char other_buffer[MAX_LEN + 1];

sscanf(command, "%s", other_buffer);

if (!strncmp(other_buffer, "in", 2)) {

command_name = INSERT;

while(++arg_counter){

printf("whileloop reached, arg_counter - 1 is %d\n", arg_counter - 1);

scanf("%s", valid_args_str[arg_counter - 1]);

}

} else if (!strncmp(other_buffer, "se", 2)) {

.

.

.

execute_comm(t, command_name, valid_args_str);

}

static void execute_comm(Table *t, COMMAND command, char *args[]){

switch(command){

case INSERT:

insert(t, args[0], args[1]);

break;

.

.

}

,这里是我的主:

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

FILE *input;

char buffer[MAX_LEN + 1];

input = stdin;

if(argc > 2){

fprintf(stderr, "%s", "Too many arguments");

perror("Too many arguments");

exit(EX_OSERR);

} else if (argc == 2){

if ((input = fopen(argv[1], "r")) == NULL) {

fprintf(stderr, "%s", "error opening files");

perror("error opening file");

exit(EXIT_FAILURE);

}

}

while (fgets(buffer, MAX_LEN + 1, input) != NULL) {

get_command(t, buffer);

}

fclose(input);

return 0;

}

我希望发生的是,它能够读取这样的文件:

插入利马豆

删除豆

等,并从标准输入。一些命令有两个参数,一个有一个,有些则没有。

再次感谢

+0

缓冲区是如何声明的 –

2010-09-30 20:52:51

+0

你不知道'printf'语句没有被评估。它打印在'stdin'上,这是一个缓冲输出文件。没有任何冲洗,甚至没有可触发冲洗的'\ n'。因此,它的输出可能会写入缓冲区,并在程序崩溃时丢失。使用'fprintf(stderr,“while ....'相反,因为'stderr'没有被缓冲,并且立即打印到任何输出。 –

2010-09-30 21:10:15

+0

另外,这是你有问题的实际代码?我没有在任何地方看到'buffer',或者'MAX_LEN'。 –

2010-09-30 21:11:45

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值