Reputation: 5989
I want to get input from the user 1234 and when i press in the 4 digit to finish the scanf I tried
int num = 0;
scanf("%4d",&num);
getchar()
printf("%d",num);
but it stopped only when I press enter and get the 4 first numbers , I don't want to press on enter I want to finish the input on the 4 digit and to get the number in num. also is it possible to get the 4 numbers to 4 different variables
int num = 0;
int num2 = 0;
int num3 = 0;
int num4 = 0;
scanf("%d%d%d%D",&num,&num2,&num3,&num4);
getchar()
but it didn't work also I can change the function of scanf to something else
Upvotes: 1
Views: 772
Reputation: 127
Input does not work like this. Your "standard input library" is buffered, it means it uses buffer, which holds characters. Pressing enter triggers that buffer to flush data and then you can read it from your program.
You need unbuffered input, AFAIK, it is not easy-portable, so there is no standard solution.
So you have 2 options:
For the second option there was a library called conio.h
(it is pretty old), which implemented getch()
method for unbuffered input, it is also implemented in ncursess.
Upvotes: 1
Reputation: 67546
It is not possible in standard C. You have to press enter. Basically, terminals used when C was created very often were sending data to the computer when the internal buffer was full or enter pressed. (Not counting punch tape and cards readers)
If you are happy to press enter after numbers are entered then:
int toNumber(char c)
{
int result = 0;
if(isdigit((unsigned char)c))
{
result = c - '0';
}
return result;
}
int isValid(const char *restrict str)
{
int result = 0;
if(strlen(str) == 4)
{
result = 1;
while(*str)
{
if(!isdigit(*str++))
{
result = 0;
break;
}
}
}
return result;
}
char *removeLastLF(char *str)
{
char *wrk = str;
if(str && *str)
{
while(*(str + 1)) str++;
if(*str == '\n') *str = 0;
}
return wrk;
}
int main(void)
{
char num[5];
int var1, var2, var3, var4;
fgets(num, 5, stdin);
if(!isValid(removeLastLF(num))) printf("Wring format\n");
else
{
var1 = toNumber(num[0]);
var2 = toNumber(num[1]);
var3 = toNumber(num[2]);
var4 = toNumber(num[3]);
}
}
Upvotes: 1