如何在 C (GCC) 中只获取整数?
How to get only integers in C (GCC)?
我有一个函数可以验证来自标准输入的数据,我只想获取整数。当我输入字母时它有效,但它不适用于十进制数字。 n 变为 1,但我在“.”之前得到数字,标准输入不清除。
#include <stdio.h>
int get_Int(int *a) {
int n;
do {
n = scanf("%d", a);
if (n == 0) {
printf("Incorrect input. Try again!\n");
scanf("%*f^\n");
scanf("%*s");
continue;
}
} while(n == 0);
return n < 0 ? 0 : 1;
}
int main() {
int n, t;
get_Int(&n);
for (int k = 0; k < n; k++) {
printf("Input next number\n");
get_Int(&t);
printf("%d\n", t);
}
}
示例截图:
我应该添加什么才能使其正常工作?或者其他解决方案?
你应该使用 strtol 或朋友(代码主要灵感来自 man strtol 和 getline):
#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int get_Int(int *a)
{
if (!a)
return 0;
while (1) {
char *line = NULL, *endptr = NULL;
size_t len = 0;
ssize_t nread = getline(&line, &len, stdin);
long n;
if (nread == -1)
continue; // read failed
errno = 0; /* To distinguish success/failure after call */
n = strtol(line, &endptr, 10 /* assuming base10 */ );
/* Check for various possible errors */
if ((errno == ERANGE && (n == LONG_MAX || n == LONG_MIN))
|| (errno != 0 && n == 0)) {
printf("number out of range, please retry\n");
continue; // over/under flow
}
if (endptr == line || *endptr != '\n') {
// No digits were found or not all input was consumed
printf("Please input integers\n");
continue;
}
*a = n;
free(line);
break;
}
return 1;
}
int main()
{
int n, t;
get_Int(&n);
for (int k = 0; k < n; k++) {
printf("Input next number\n");
get_Int(&t);
printf("%d\n", t);
}
}
这意味着您应该单独阅读该行并在之后提取值。您可能会注意到要执行大量检查以确保调用的有效性,并且此处的代码块远非完美,需要对函数的 return 值进行一些说明...
我有一个函数可以验证来自标准输入的数据,我只想获取整数。当我输入字母时它有效,但它不适用于十进制数字。 n 变为 1,但我在“.”之前得到数字,标准输入不清除。
#include <stdio.h>
int get_Int(int *a) {
int n;
do {
n = scanf("%d", a);
if (n == 0) {
printf("Incorrect input. Try again!\n");
scanf("%*f^\n");
scanf("%*s");
continue;
}
} while(n == 0);
return n < 0 ? 0 : 1;
}
int main() {
int n, t;
get_Int(&n);
for (int k = 0; k < n; k++) {
printf("Input next number\n");
get_Int(&t);
printf("%d\n", t);
}
}
示例截图:
我应该添加什么才能使其正常工作?或者其他解决方案?
你应该使用 strtol 或朋友(代码主要灵感来自 man strtol 和 getline):
#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int get_Int(int *a)
{
if (!a)
return 0;
while (1) {
char *line = NULL, *endptr = NULL;
size_t len = 0;
ssize_t nread = getline(&line, &len, stdin);
long n;
if (nread == -1)
continue; // read failed
errno = 0; /* To distinguish success/failure after call */
n = strtol(line, &endptr, 10 /* assuming base10 */ );
/* Check for various possible errors */
if ((errno == ERANGE && (n == LONG_MAX || n == LONG_MIN))
|| (errno != 0 && n == 0)) {
printf("number out of range, please retry\n");
continue; // over/under flow
}
if (endptr == line || *endptr != '\n') {
// No digits were found or not all input was consumed
printf("Please input integers\n");
continue;
}
*a = n;
free(line);
break;
}
return 1;
}
int main()
{
int n, t;
get_Int(&n);
for (int k = 0; k < n; k++) {
printf("Input next number\n");
get_Int(&t);
printf("%d\n", t);
}
}
这意味着您应该单独阅读该行并在之后提取值。您可能会注意到要执行大量检查以确保调用的有效性,并且此处的代码块远非完美,需要对函数的 return 值进行一些说明...