【发布时间】:2015-11-13 10:55:07
【问题描述】:
我以前是一名 java 程序员,但我现在正在大学学习 C 课程(计算机科学专业)。
我需要用户能够输入 3 个字符,前 2 个是数字,最后 1 个是 'v' 或 'h'。 例如“1 2 v”。
我需要用户能够在每个字符之间输入空格。
这是我当前的代码:
void manageInput(char box[][width]){
char move[4];
char input[16];
while(1){
scanf("%s", input);
int i = 0;
while(input[i] != 0){
if(input[i] != ' ' && input[i] != "\n"){
move[i] = input[i];
}
i++;
}
printf("%s\n", move);
makeMove(box, move);
printBox(box, height, width);
// TODO
if(move[0] == 'x'){
exit(0);
}
}
}
但是,如果我运行它,当我输入没有空格的字符(如“12v”)时它可以正常工作,但如果我输入“1 2 v”,它将打印出“1”,调用 printBox,然后打印出“ 2",然后再次打印出框,以此类推。
如果有人能解释我在这里做错了什么,我将不胜感激。
【问题讨论】:
-
那么是数字还是
char/字符?这在 Java 中也应该有所不同。并限制 scanf 输入的长度,否则会遇到 未定义的行为。 -
char move[4] = {0};scanf(" %c %c %c", &move[0], &move[1],&move[2]); -
"输入 3 个字符,前 2 个是数字,后 1 个是 'v' 或 'h'。例如 "1 2 v"。"是误导。 “1 2 v”是 5 个
char,如果算上“输入”,还有 1 个。显然代码需要读取3个非空白char。 -
当使用带有 '%s' 格式说明符的 scanf()(和系列)时,为避免输入缓冲区溢出(如用户,在这种情况下,输入 16 个或更多字符),始终包含最大长度修饰符,它比输入缓冲区的长度小 1。并始终检查返回值(不是参数值)以确保操作成功