C-读取大于可接受的输入时,在stdin中清理时出现故障



我正在编写交互式数独游戏,并从控制台解析命令。

我想将用户命令限制为最多256个字符,而任何额外的字符都会打印一条错误消息,并通知他它超过了最大长度。

因此,我已经为256长度的char数组分配了内存,并通过fgets函数读取该输入,然后将其传递给解析器函数,这是我这部分的代码-注意输入是我从fgets func传递的输入。

Command parseCommand(char *input, int upperBound, MODE* mode){
Command command;
char* token;
char *copyInput = (char*) malloc(strlen(input)*sizeof(char));
if(copyInput == NULL){
printf("Error: parseCommand has failedn");
free(copyInput);
exit(EXIT_FAILURE);
}
command.cmd = ERROR;
strcpy(copyInput,input);
token = strtok(input,delim);
if(strlen(copyInput) > 256){
command.cmd = MAX_ARGS_REACHED;
clear();
}...//More code following to that but irrelvant

现在我相信问题出在我的clear函数中,因为那里什么都没发生,它从来没有离开过它,但如果我按enter-twich,那么它是258个字符,它可以完美地工作,例如,每个大小大于257的输入都可以完美地工作,只有257的问题。

void clear(){
int c = 0;
while ((c = getchar()) != 'n' && c != EOF) { }

}

希望在这里得到帮助,谢谢!

编辑-下面的代码显示了我如何读取输入并将其传递给上面的函数-

void runGame(){
Game* game;
char* input = (char*) malloc(256 * sizeof(char));
if(input == NULL){
printf("Error: Program has failed!n");
free(input);
exit(EXIT_FAILURE);
}
printf("Welcome to Sudoku Game!n");
game = createGame();
while(1){
Command command;
printf("Please enter a Commandn");
if(!fgets(input,ARRSIZE,stdin)){/*checks if reading user input failed or EOF*/
exitCommand(game);
free(input);
return;
}
command = parseCommand(input,game->rows,&game->mode);//More code following to that

输入数组大小不足。

我想将用户命令限制为最多256个字符
ARRSIZE=256

除了内存分配不足(我认为这是OP的关键问题(之外,读取输入的还需要一个更大的数组。

对于CCD_ 2,CCD_。缓冲器input的字符串长度最多为255。

目前尚不清楚OP是否考虑输入的Enter'n'部分。fgets()确实如此。

跳闸strlen(copyInput) > 256需要长度至少为257的字符串

要读取最多257行(不计算电位'n'(,代码应使用256+1+1+1长度的缓冲区。

#define CMD_N 256
//                      extra to test too long, n,   
#define BUFFER_N (CMD_N + 1                    + 1 + 1)

char* input = malloc(BUFFER_N);
....
if(!fgets(input,BUFFER_N,stdin)) {
buffer[strcspn(buffer, "n")] = '';  // lop off potential n
....
if(strlen(copyInput) > CMD_N) {

至少这个问题

内存分配不足

空字符需要+1。(C中不需要铸造(

// char *copyInput = (char*) malloc(strlen(input)*sizeof(char));
char *copyInput = malloc(strlen(input) + 1);
strcpy(copyInput,input);

建议:

按照呼叫fgets()使用:

int ch;
while( (ch = getchar()) != EOF && ch != 'n' ){;}

因为这将适当地消耗stdin中的任何剩余数据

相关内容

  • 没有找到相关文章

最新更新