Как отформатировать ввод, чтобы принимать только целочисленные значения - PullRequest
0 голосов
/ 29 апреля 2010

входное значение 123 - это значение является целым числом и действительно

входное значение 1b23a - это значение недопустимо

Как определить, какие значения действительны, а какие нет?

Вот мой код:

#include <stdio.h>
#include <conio.h>
void main()
{
    char str1[5],str2[5];
    int num,num1,i;
    num=0;
    clrscr();
    printf("Enter the Number ");
    scanf("%s",str1);
    for(i=0;str1[i]!='\0';i++)
    {
        if(str1[i]>=48&&str1[i]<=56)
            num=num1*10+(str[i]-48);
        else
        {
            printf("The value is invalid ");
        }
    }
    printf("This Number is %d",num);
    getch();
}

Ответы [ 3 ]

1 голос
/ 29 апреля 2010

Пожалуйста, смотрите этот ответ относительно использования strtol () . Это безопасный способ преобразования произвольных входных данных, которые должны быть строковым представлением целого числа, сохраняя при этом байты мусора для дополнительного анализа.

Используя его, ваш код будет выглядеть примерно так:

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#ifdef LINUX_VERSION
#include <curses.h>
#else
#include <conio.h>
#endif

#define BUFF_SIZE 1024

int main(void)
{
    char str1[BUFF_SIZE], *garbage = NULL;
    long num = 0;

    printf("Enter the Number ");
    scanf("%s",str1);

    errno = 0;

    num = strtol(str1, &garbage, 0);
    if (errno) {
       printf("The number is invalid\n");
       return 1;
    }

    printf("You entered the number %ld\n", num);
    if (garbage != NULL) {
        printf("Additional garbage that was ignored is '%s'\n", garbage);
    }
    getch();
    return 0;
}

Это не исправляет все, что вызывает сомнения относительно того, что вы опубликовали, но это должно помочь вам лучше начать.

Вывод:

tpost@tpost-desktop:~$ ./t 
Enter the Number 1234abdc 
You entered the number 1234
Additional garbage that was ignored is 'abdc'

Скомпилировано с помощью:

gcc -Wall -DLINUX_VERSION -o t t.c -lcurses

Я не уверен, какую платформу вы используете, поэтому могут потребоваться дополнительные исправления в коде.

0 голосов
/ 29 апреля 2010

Один из способов - использовать sscanf и убедиться, что после числа нет символов. Это проще всего сделать, добавив %c в конце и протестировав код возврата, например:

const char *yourString = ...;
int theValue, dummy;
if (sscanf(yourString, "%d%c", &theValue, &dummy) == 1) {
    // Was a pure number, parsed into 'theValue'
} else {
    // Either no number or had junk after it
}
0 голосов
/ 29 апреля 2010
#include<stdio.h>
#include<conio.h>
void main()
{
char str1[5],str2[5];
int num,num1,i;
num=0;
clrscr();
printf("Enter the Number ");
scanf("%s",str1);
for(i=0;str1[i]!='\0';i++)
if(str1[i]>=48&&str1[i]<=56)
num=num1*10+(str[i]-48);
else
{
printf("The value is invalid ");
}
}
printf("This Number is %d",num);
getch();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...