2010-09-30 124 views
0

我不理解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

缓冲区是如何声明的 – Svisstack 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

回答

1

我怀疑你buffer变量不分配。你是否这样申明?

char* buffer;

如果是这样,这就是为什么你赛格断层。

您需要为缓冲区分配内存。

char buffer[1024];

+0

其正确初始化。我增加了更多的问题 – 2010-10-01 21:11:47

1

fgets从文件中读取一整行(最多行)在可变FILE* input,并把该行中buffer

scanf正在从标准输入读取非空白字符序列,并将其写入command,该字符与buffer看起来是相同的指针。

这里的东西几乎肯定不是你想要的东西。也许你的意思是

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