2010-09-30 94 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);