我知道这是一个老问题,我知道这是一个家庭作业,我知道 OP 不会回来接受我的答案,但是这个问题启发了我编写以下程序,它是这个的正确答案问题。
#include <termios.h>
#include <unistd.h>
#include <stdio.h>
int getdigit() {
int total = 0;
struct termios oldtc, newtc;
int ch;
tcgetattr(STDIN_FILENO, &oldtc);
newtc = oldtc;
newtc.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newtc);
while (1) {
ch=getchar();
if (ch == 127) { // Backspace
total /= 10;
printf("\b \b");
continue;
} else if (ch == 10) { // Return
putchar(ch);
break;
} else if (ch < '0' || ch > '9') {
continue;
}
putchar(ch);
total *= 10;
total += ch-'0';
}
tcsetattr(STDIN_FILENO, TCSANOW, &oldtc);
return total;
}
int main() {
int n;
printf("Enter a number: ");
n = getdigit();
printf("You entered: %d\n", n);
return 0;
}
给你,一个C
只接受数字作为输入的程序。它将忽略所有字母;他们甚至不会出现在终端中。
不过也有一些问题。它不处理整数溢出;输入太多数字,它不会返回正确的值。您可以通过添加一个计数器来解决这个问题,并且不允许超过x
字符。计数器也可以很好地阻止用户用退格键擦除整行。如果我实施一个计数器,我可能会回来并发布更新。
我只在 Mac OS X Lion 上测试过该程序,但我认为它可以在大多数 Unix 兼容系统上运行。没有任何明示或暗示的保证。
编辑:这是一个实现了该计数器的版本。
#include <termios.h>
#include <unistd.h>
#include <stdio.h>
int getdigits(int limit) {
if (limit > 9 || limit < 1) limit = 9;
int count = 0;
int total = 0;
struct termios oldtc, newtc;
int ch;
tcgetattr(STDIN_FILENO, &oldtc);
newtc = oldtc;
newtc.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newtc);
while (1) {
ch=getchar();
if (ch == 127) { // Backspace
if (count > 0) {
total /= 10;
count--;
printf("\b \b");
} else {
putchar('\a');
}
} else if (ch == 10) { // Return
putchar(ch);
break;
} else if (ch < '0' || ch > '9') {
putchar('\a');
} else {
if (count < limit) {
putchar(ch);
total *= 10;
total += ch-'0';
count++;
} else {
putchar('\a');
}
}
}
tcsetattr(STDIN_FILENO, TCSANOW, &oldtc);
return total;
}
int main() {
int n;
printf("Enter a number: ");
n = getdigits(0);
printf("You entered: %d\n", n);
return 0;
}
最大(和默认)限制为 9 位。如果您想要更高的限制,您可以实现该方法的 64 位版本。我没有打扰,因为 OP 将使用此代码来设置二维整数数组的大小。999,999,999*999,999,999*4 字节(假设为 32 位整数)大约等于 4 艾字节,我认为我们还需要一段时间才能拥有这么多内存的计算机。如果你有一台内存这么大的电脑,我很乐意为你制作一个 64 位版本。*(我不知道你会用这样的数组做什么。)
我添加的另一件事是每当用户输入无效输入时都会发出哔哔声。认为当我们不接受他的输入时给用户一些反馈可能会很好。
*当然,我知道您可能希望将输入用于创建巨大的多维数组之外的其他用途,在这种情况下,我也很乐意为您编写 64 位版本。