2015-11-05 5 views
-1

Хорошо, новичок здесь, но мне нужна небольшая помощь/понимание того, как начать писать конкретную программу. Я не прошу кого-то сделать это для меня, я просто прошу о подходе к этой проблеме, потому что я честно не знаю, как начать.Сканирование действительного целого числа

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

  • 0 или более ведущие пробельные следуют ...
  • дополнительный «+» или «-», а затем ...
  • 1 или более цифр, за которыми следует не буквенно-цифровая, но не цифра '.' а затем 1 или более цифр.

Примеры действительных чисел: «1234», «1234», «1234.», «+1234», "12 + 34", "1234.", "1234 х" и «-1234» все целые числа, и ни один из «1234e5», «e1234», «1234,56» и «1234abc» не является.

До сих пор все, что я могу придумать, использует кучу операторов if для проверки действительных целых чисел, но я не могу помочь, но думаю, что должен быть лучший и более надежный подход, чем использование множества утверждений if для проверки каждый символ строки. Я не могу придумать какие-либо функции, которые были бы полезны мне, кроме использования isdigit() и, возможно, strtol()? Любой совет будет принят во внимание.

+0

Поскольку это выглядит как упражнение в области компьютерных наук, могут быть границы для упражнения (запрещающие использование готовых функций преобразования и т. Д.). Тем не менее, у меня есть два слова для вас: регулярные выражения. –

+0

'man strtol':« Строка может начинаться с произвольного количества пробелов (как определено isspace (3)), за которым следует один необязательный знак «+» или «-» ». Только нестандартная процедура состоит в том, чтобы запретить четкие значения с плавающей запятой (период начала); но для этого и есть его '** endptr'. – usr2564301

+0

Если это действительно упражнение cs, вам следует использовать простой код вместо regexp. Поэтому проверяем все символы сложной логикой. – abbath

ответ

2

Вам просто нужно изучить каждого символа в цикле и сохранить маленький конечный автомат, пока вы решите, что он недействителен или вы дойдете до конца.

Редактировать: ничего плохого в операторах if или вы не можете использовать оператор switch.

+2

+1 для ** не ** предоставление полного решения или использование регулярного выражения или аналогичного. Просто добавьте OP, чтобы посмотреть на 'ctype.h'. – Olaf

1

я бы, вероятно, использовать sscanf (или fscanf и т.д.)

Хотя он не поддерживает полные регулярные выражения, scanf строки формата поддерживают scan set преобразования, которые примерно как набор символов в регулярном выражении (включая инвертированные, например, %1[^a-zA-Z0-9] соответствует одному символу, отличному от алфавитно-цифрового).

Единое пространство в строке формата соответствует произвольному количеству пробелов на входе.

+0

Это звучит как упражнение для создания lexxer. использование 'scanf' или regexp было бы плохим советом. – Olaf

+0

По крайней мере, для меня это выглядит/звучит довольно странно, как упражнение. Я не вижу ничего, чтобы оправдать предположение, что это (и если вы не уверены, что это, написав свой собственный лексер для чего-то, что scanf может делать быстро и легко, это просто плохая идея). –

+0

Вы никогда не программировали встроенные системы, не так ли? И даже если у вас есть «scanf» доступный, часто быстрее и не много усилий, чтобы самостоятельно разбирать. Кто знает? Это может быть расширено на следующем этапе. – Olaf

0

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

И остерегайтесь восторженного примера кода .. см. Справочную страницу для всесторонней обработки ошибок.

+0

OP запрашивает проверку синтаксиса, а не чтение/преобразование. И 'strtol' не соответствует указанному синтаксису. – Olaf

+1

'strtol()' хорошо соответствует первой части требований OP: 'WS, sign, digits' – chux

1

Поместите свои слова в код - по одной штуке за раз. Псевдокод следует за

// to detect valid integers. 
success_failure detect valid integers(const char *s) { 

    // 0 or more leading white spaces followed by... 
    while (test_for_whitespace(*s)) s++; 

    // an optional '+' or '-' followed by... 
    if (test_if_sign(*s)) s++; 

    // 1 or more digits, ... 
    digit_found = false; 
    while (test_if_digit(*s)) { s++; digit_found = true; ] 
    if (!digit_found) return fail; 

    // followed by a non-alphanumeric, but not a '.' followed by 1 or more digits. 
    if (is_a_non_alphanumeric_non_dp_not_null(*s)) { 
    s++; 
    digit_found = false; 
    while (test_if_digit(*s)) { s++; digit_found = true; ] 
    if (!digit_found) return fail; 
    } 

    if (is_not_a_null_character(*s)) return fail; 
    return success; 
} 
+1

Предоставление человеку рыбы вместо того, чтобы научить его, как ловить рыбу, - плохая идея. Имо это уже слишком полно. – Olaf

+0

@Olaf Изменить по своему вкусу. – chux

+0

Я, конечно, не буду. Слишком поздно, так как кошка уже вне коробки. – Olaf

Смежные вопросы