我正在编写交互式数独游戏,并从控制台解析命令。
我想将用户命令限制为最多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
中的任何剩余数据