问题在于我不能使用atoi或任何其他类似的功能(我很确定我们应该依赖于数学运算)。
int num;
scanf("%d",&num);
if(/* num is not integer */) {
printf("enter integer");
return;
}
我试过了:
(num*2)/2 == num
num%1==0
if(scanf("%d",&num)!=1)
但这些都没有奏效。
有什么想法吗?
答案 0 :(得分:36)
num
将始终包含一个整数,因为它是int
。您的代码的真正的问题是您没有检查scanf
返回值。 scanf
返回成功读取的项目数,因此在这种情况下,必须为有效值返回1。如果没有,则输入了一个无效的整数值,num
变量可能没有被更改(即仍然有一个任意值,因为你没有初始化它)。
在评论中,您只想允许用户输入一个整数,然后输入回车键。不幸的是,这不能通过scanf("%d\n")
简单地实现,但这是一个诀窍:
int num;
char term;
if(scanf("%d%c", &num, &term) != 2 || term != '\n')
printf("failure\n");
else
printf("valid integer followed by enter key\n");
答案 1 :(得分:22)
您需要先将输入作为字符串读取,然后解析字符串以查看它是否包含有效的数字字符。如果是,则可以将其转换为整数。
char s[MAX_LINE];
valid = FALSE;
fgets(s, sizeof(s), stdin);
len = strlen(s);
while (len > 0 && isspace(s[len - 1]))
len--; // strip trailing newline or other white space
if (len > 0)
{
valid = TRUE;
for (i = 0; i < len; ++i)
{
if (!isdigit(s[i]))
{
valid = FALSE;
break;
}
}
}
答案 2 :(得分:13)
将scanf
与%d
转换说明符一起使用会出现以下问题:
如果输入字符串以有效整数(例如“12abc”)开头,则将从输入流中读取“12”并转换并分配给num
和{{1将返回1,因此当您(可能)不应该返回时,您将指示成功;
如果输入字符串不以数字开头,则scanf
将不会从输入流中读取任何字符{{ 1}}不会被更改,返回值将为0;
您没有指定是否需要处理非十进制格式,但如果您必须处理八进制或十六进制格式(0x1a)的整数值,则无法使用。 scanf
转换说明符处理十进制,八进制和十六进制格式,但您仍然有前两个问题。
首先,您需要将输入作为字符串读取(最好使用num
)。如果您不允许使用%i
,则可能不允许您使用fgets
。所以你需要检查字符串中的每个字符。检查数字值的安全方法是使用atoi
库函数(还有strtol
和isdigit
函数分别用于检查八进制和十六进制数字),例如
isodigit
(如果您甚至不允许使用isxdigit
,while (*input && isdigit(*input))
input++;
或isdigit
,那么请打击您的老师/教授,使其完成比实际需要更难的任务) 。
如果您需要能够处理八进制或十六进制格式,那么它会变得更复杂一些。 C约定是八进制格式具有前导isodigit
数字,十六进制格式具有前导isxdigit
。因此,如果第一个非空白字符为0,则必须先检查下一个字符,然后才能知道要使用哪种非十进制格式。
基本概要是
0
检查剩余字符; 0x
或isdigit
,则输入采用十六进制格式,您将使用isodigit
检查剩余的字符; 答案 3 :(得分:4)
首先问问自己 如何 返回一个整数:
int num;
scanf("%d",&num);
您将变量指定为整数类型,然后指定scanf
,但仅指定表示整数(%d
)。
此时还有什么可能包含的内容?
答案 4 :(得分:1)
如果其他人提出这个问题,我已经编写了一个程序,如果用户输入的不是整数,则不断要求输入一个数字,并在接受一个整数时完成
#include<stdlib.h>
#include<stdio.h>
#include<stdbool.h>
bool digit_check(char key[])
{
for(int i = 0; i < strlen(key); i++)
{
if(isdigit(key[i])==0)
{
return false;
}
}
return true;
}
void main()
{
char stroka[10];
do{
printf("Input a number: ");
scanf("%s",stroka);}
while (!digit_check(stroka));
printf("Number is accepted, input finished!\n");
system("pause");
}
答案 5 :(得分:0)
我查看了上面每个人的输入,这非常有用,并且创建了一个适合我自己的应用程序的功能。该函数实际上只是评估用户的输入不是“0”,但它足以满足我的目的。希望这有帮助!
#include<stdio.h>
int iFunctErrorCheck(int iLowerBound, int iUpperBound){
int iUserInput=0;
while (iUserInput==0){
scanf("%i", &iUserInput);
if (iUserInput==0){
printf("Please enter an integer (%i-%i).\n", iLowerBound, iUpperBound);
getchar();
}
if ((iUserInput!=0) && (iUserInput<iLowerBound || iUserInput>iUpperBound)){
printf("Please make a valid selection (%i-%i).\n", iLowerBound, iUpperBound);
iUserInput=0;
}
}
return iUserInput;
}
答案 6 :(得分:0)
试试这个......
#include <stdio.h>
int main (void)
{
float a;
int q;
printf("\nInsert number\t");
scanf("%f",&a);
q=(int)a;
++q;
if((q - a) != 1)
printf("\nThe number is not an integer\n\n");
else
printf("\nThe number is an integer\n\n");
return 0;
}
答案 7 :(得分:0)
我猜这是一个更加用户友好的一个:
#include<stdio.h>
/* This program checks if the entered input is an integer
* or provides an option for the user to re-enter.
*/
int getint()
{
int x;
char c;
printf("\nEnter an integer (say -1 or 26 or so ): ");
while( scanf("%d",&x) != 1 )
{
c=getchar();
printf("You have entered ");
putchar(c);
printf(" in the input which is not an integer");
while ( getchar() != '\n' )
; //wasting the buffer till the next new line
printf("\nEnter an integer (say -1 or 26 or so ): ");
}
return x;
}
int main(void)
{
int x;
x=getint();
printf("Main Function =>\n");
printf("Integer : %d\n",x);
return 0;
}
答案 8 :(得分:0)
我使用gets和远离scanf麻烦开发了这个逻辑:
void readValidateInput() {
char str[10] = { '\0' };
readStdin: fgets(str, 10, stdin);
//printf("fgets is returning %s\n", str);
int numerical = 1;
int i = 0;
for (i = 0; i < 10; i++) {
//printf("Digit at str[%d] is %c\n", i, str[i]);
//printf("numerical = %d\n", numerical);
if (isdigit(str[i]) == 0) {
if (str[i] == '\n')break;
numerical = 0;
//printf("numerical changed= %d\n", numerical);
break;
}
}
if (!numerical) {
printf("This is not a valid number of tasks, you need to enter at least 1 task\n");
goto readStdin;
}
else if (str[i] == '\n') {
str[i] = '\0';
numOfTasks = atoi(str);
//printf("Captured Number of tasks from stdin is %d\n", numOfTasks);
}
}
答案 9 :(得分:0)
printf("type a number ");
int converted = scanf("%d", &a);
printf("\n");
if( converted == 0)
{
printf("enter integer");
system("PAUSE \n");
return 0;
}
scanf()返回匹配的格式说明符数,因此如果输入的文本不能解释为十进制整数,则返回零
答案 10 :(得分:-1)
我一直在寻找一个更简单的解决方案,只使用循环和if语句,这就是我想出来的。该程序也适用于负整数,并正确拒绝任何可能包含整数和其他字符的混合输入。
#include <stdio.h>
#include <stdlib.h> // Used for atoi() function
#include <string.h> // Used for strlen() function
#define TRUE 1
#define FALSE 0
int main(void)
{
char n[10]; // Limits characters to the equivalent of the 32 bits integers limit (10 digits)
int intTest;
printf("Give me an int: ");
do
{
scanf(" %s", n);
intTest = TRUE; // Sets the default for the integer test variable to TRUE
int i = 0, l = strlen(n);
if (n[0] == '-') // Tests for the negative sign to correctly handle negative integer values
i++;
while (i < l)
{
if (n[i] < '0' || n[i] > '9') // Tests the string characters for non-integer values
{
intTest = FALSE; // Changes intTest variable from TRUE to FALSE and breaks the loop early
break;
}
i++;
}
if (intTest == TRUE)
printf("%i\n", atoi(n)); // Converts the string to an integer and prints the integer value
else
printf("Retry: "); // Prints "Retry:" if tested FALSE
}
while (intTest == FALSE); // Continues to ask the user to input a valid integer value
return 0;
}
答案 11 :(得分:-1)
此方法适用于除零之外的所有内容(整数甚至双精度)(它将其称为无效):
while循环仅用于重复的用户输入。基本上它会检查整数x / x是否为1.如果是(如同数字一样),则为整数/双精度。如果它没有,显然它不是。 Zero虽然没有通过测试。
#include <stdio.h>
#include <math.h>
void main () {
double x;
int notDouble;
int true = 1;
while(true) {
printf("Input an integer: \n");
scanf("%lf", &x);
if (x/x != 1) {
notDouble = 1;
fflush(stdin);
}
if (notDouble != 1) {
printf("Input is valid\n");
}
else {
printf("Input is invalid\n");
}
notDouble = 0;
}
}
答案 12 :(得分:-1)
只需检查您的号码是否与浮动版本有所不同。
float num;
scanf("%f",&num);
if(num != (int)num) {
printf("it's not an integer");
return;
}
答案 13 :(得分:-2)
我遇到了同样的问题,终于找到了要做的事情:
#include <stdio.h>
#include <conio.h>
int main ()
{
int x;
float check;
reprocess:
printf ("enter a integer number:");
scanf ("%f", &check);
x=check;
if (x==check)
printf("\nYour number is %d", x);
else
{
printf("\nThis is not an integer number, please insert an integer!\n\n");
goto reprocess;
}
_getch();
return 0;
}
答案 14 :(得分:-3)
我找到了一种使用atoi()函数检查给定输入是否为整数的方法。
以字符串形式读取输入,并使用atoi()函数将字符串转换为整数。
如果输入字符串包含整数,则atoi()函数返回整数,否则返回0.您可以检查atoi()函数的返回值,以了解给定的输入是否为整数。
还有很多函数可以将字符串转换为long,double等。检查标准库&#34; stdlib.h&#34;更多。
注意:它仅适用于非零数字。
#include<stdio.h>
#include<stdlib.h>
int main() {
char *string;
int number;
printf("Enter a number :");
string = scanf("%s", string);
number = atoi(string);
if(number != 0)
printf("The number is %d\n", number);
else
printf("Not a number !!!\n");
return 0;
}