입력이 C의 정수 유형인지 확인합니다.
단점은 제가 장난감이나 그런 다른 기능을 사용할 수 없다는 것입니다(수학적 연산에 의존해야 한다고 꽤 확신합니다).
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)
하지만 아무 것도 효과가 없었습니다.
아이디어 있어요?
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");
입력한 내용을 문자열로 읽은 다음 문자열을 구문 분석하여 올바른 숫자가 포함되어 있는지 확인해야 합니다.그러면 정수로 변환할 수 있습니다.
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;
}
}
}
사용할 때 몇 가지 문제가 있습니다.scanf
%d
작업을 :
이 유효한 "하면 "가 입력 "12abc"("12abc")로 되어 할당됩니다.
num
,그리고.scanf
에 ( 때 합니다; 1을 반환합니다.입력 문자열이 숫자로 시작하지 않는 경우
scanf
입력 스트림의 문자를 읽지 않습니다.num
반환값은 입니다.10진수가 아닌 형식을 처리할 필요가 있는지 여부는 지정하지 않지만 정수 값을 8진수 또는 16진수 형식(0x1a)으로 처리해야 하는 경우에는 지정할 수 없습니다. 그
%i
변환 지정자는 10진수, 8진수 및 16진수 형식을 처리하지만 처음 두 가지 문제가 있습니다.
여러분은 할 입니다. ( 이면 우입 문권읽합어니다야로자열력장을선권(합다니▁first:▁(읽어야▁string▁thepreably장우입▁as▁input▁you▁usingfer:fgets
수 없는 에는 을 사용합니다.atoi
아마도 당신은 사용할 수 없습니다.strtol
어느하나▁. 그래서 따라서 문자열의 각 문자를 검사해야 합니다.은 자수값확방인은을 입니다.isdigit
라이브러리 기능(또한 있습니다.isodigit
그리고.isxdigit
를 각각 을 제공합니다.
while (*input && isdigit(*input))
input++;
할 수 에도)isdigit
,isodigit
또는isxdigit
그런 다음 과제를 실제 필요 이상으로 어렵게 만든 것에 대해 선생님/학생을 때립니다.)
만약 당신이 8진수나 16진수 형식을 다룰 수 있어야 한다면, 그것은 조금 더 복잡해집니다.C 규약은 8진수 형식이 선행되어야 합니다.0
숫자 및 16진수 형식의 경우 선행 형식을 사용합니다.0x
따라서 첫 번째 공백이 아닌 문자가 0이면 다음 문자를 확인해야 사용할 10진수가 아닌 형식을 알 수 있습니다.
기본적인 윤곽은.
- 공백이 아닌 첫 번째 문자가 '-', '+', '0' 또는 0이 아닌 10진수가 아닌 경우 올바른 정수 문자열이 아닙니다.
- 공백이 아닌 첫 번째 문자가 '-'이면 음수 값이고, 그렇지 않으면 양수 값으로 가정합니다.
- 첫 번째 문자가 '+'이면 양수입니다.
- 문자일 이고, 공이이아진 0첫번진아문없는 10호경형다식 10수니며이사를 .
isdigit
나머지 문자를 확인합니다. - 공백이 아닌 첫 번째 문자와 부호가 없는 문자가 '0'이면 입력은 8진수 또는 16진수 형식입니다.
- 이 아닌 가 '에서 사이의 이며, 공이아첫번문부가 '0'고다이진문음문자자 '0'사이숫의에자인경우가사입문용합다니를력자 '7'음며다이식형은수백서닌 8아닌째호자가와진▁if▁was▁use▁and를 사용하게 됩니다.
isodigit
나머지 문자를 확인합니다. - 공백이 아닌 첫 번째 문자와 부호가 없는 문자가 0이고 두 번째 문자가 다음과 같습니다.
x
또는X
그면진입 16수형식고당사것신입다니용할은이러를 사용하게 됩니다.isxdigit
나머지 문자를 확인합니다. - 나머지 문자가 위에서 지정한 확인 기능을 충족하지 못하면 올바른 정수 문자열이 아닙니다.
먼저 이 코드가 정수를 반환하지 않을 것으로 예상하는지 자문해 보십시오.
int num;
scanf("%d",&num);
유형 정수로 " " " " " 를 지정합니다.scanf
하지만 정수에 대해서만 (%d
).
이 시점에서 그것은 또 무엇을 포함할 수 있습니까?
만약 다른 사람이 이 질문을 생각해 낸다면, 나는 사용자의 입력이 정수가 아닐 경우 번호를 계속 입력하도록 요청하고 정수 번호를 수락하면 끝나는 프로그램을 작성했습니다.
#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");
}
저는 위의 모든 사람들의 입력을 살펴보았는데, 매우 유용했고, 제 자신의 응용에 적합한 기능을 만들었습니다.그 기능은 정말로 사용자의 입력이 "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;
}
해보세요...
#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;
}
이것이 더 사용자 친화적인 것이라고 생각합니다.
#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;
}
저는 스캔 번거로움에서 벗어나 gets and away를 사용하여 이 논리를 개발했습니다.
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);
}
}
제가 이 문제를 해결하는 방법은 cs50.h 라이브러리를 사용하는 것이었습니다.헤더는 다음과 같습니다.
#include <cs50.h>
여기서 get_int 함수는 변수 시작에 사용됩니다.
int a = get_int("Your number is: ");
사용자가 정수를 제외한 모든 항목을 입력하는 경우, 출력은 정수가 기록될 때까지 "Your number is:" 행을 반복합니다.
저는 루프와 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;
}
printf("type a number ");
int converted = scanf("%d", &a);
printf("\n");
if( converted == 0)
{
printf("enter integer");
system("PAUSE \n");
return 0;
}
scanf()는 일치하는 형식 지정자의 수를 반환하므로 입력한 텍스트를 십진수 정수로 해석할 수 없는 경우 0을 반환합니다.
그냥 당신의 번호가 그것의 플로트 버전과 다른지 확인하세요.
float num;
scanf("%f",&num);
if(num != (int)num) {
printf("it's not an integer");
return;
}
이 방법은 0을 제외한 모든 것(정수 및 중복)에 적용됩니다(잘못된 것이라고 함).
while 루프는 반복적인 사용자 입력을 위한 것입니다.기본적으로 x/x 정수 = 1인지 확인합니다.숫자를 사용하는 경우와 마찬가지로 정수/더블입니다.만약 그렇지 않다면, 분명히 그렇지 않습니다.하지만 0은 테스트에 실패합니다.
#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;
}
}
저도 같은 문제를 겪고 있었고, 마침내 어떻게 해야 할지 알게 되었습니다.
#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;
}
toi() 함수를 사용하여 주어진 입력이 정수인지 아닌지 확인할 수 있는 방법을 찾았습니다.
입력을 문자열로 읽고 toi() 함수를 사용하여 문자열을 정수로 변환합니다.
toi() 함수는 입력 문자열에 정수가 포함되어 있으면 정수 번호를 반환하고, 그렇지 않으면 0을 반환합니다.atoi() 함수의 반환 값을 확인하여 지정된 입력이 정수인지 여부를 알 수 있습니다.
문자열을 long, double 등으로 변환하는 기능이 훨씬 더 많습니다. 표준 라이브러리 "stdlib"을 확인하십시오.h" 더 많은 것을.
참고: 0이 아닌 숫자에 대해서만 작동합니다.
#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;
}
언급URL : https://stackoverflow.com/questions/4072190/check-if-input-is-integer-type-in-c
'programing' 카테고리의 다른 글
compileSdkVersion과 targetSdkVersion의 차이점은 무엇입니까? (0) | 2023.06.14 |
---|---|
C: 할당되지 않은 포인터가 NULL이 아닌 예측 불가능한 메모리를 가리키는 이유는 무엇입니까? (0) | 2023.06.14 |
Firestore에서 모든 하위 컬렉션과 중첩된 하위 컬렉션이 있는 문서 삭제 (0) | 2023.06.14 |
Firebase 캐시를 바이패스하여(Android 앱에서) 데이터를 새로 고치는 방법은 무엇입니까? (0) | 2023.06.14 |
마이그레이션 변경 열을 FK로 후속 처리한 후 실패 취소 (0) | 2023.06.14 |