我不理解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;
}
我希望發生的是,它能夠讀取這樣的文件:
插入利馬豆
刪除豆
等,並從標準輸入。一些命令有兩個參數,一個有一個,有些則沒有。
再次感謝
緩衝區是如何聲明的 – Svisstack 2010-09-30 20:52:51
你不知道'printf'語句沒有被評估。它打印在'stdin'上,這是一個緩衝輸出文件。沒有任何沖洗,甚至沒有可觸發沖洗的'\ n'。因此,它的輸出可能會寫入緩衝區,並在程序崩潰時丟失。使用'fprintf(stderr,「while ....'相反,因爲'stderr'沒有被緩衝,並且立即打印到任何輸出。 – 2010-09-30 21:10:15
另外,這是你有問題的實際代碼?我沒有在任何地方看到'buffer',或者'MAX_LEN'。 – 2010-09-30 21:11:45