Определить, является ли последовательность правильной записью целого числа - C (СИ)
Формулировка задачи:
Вот мой код. Его нужно переделать. Он проверяет посимвольно, а нужно чтобы как целую строку. Изьян моего кода в том, что если написать 22+22 все же выйдет, что запись правильная.
Не могу разобраться, как через gets() сделать.
Код Си!
Листинг программы
- #include <stdio.h>
- int main()
- {
- int c;
- printf("Enter only number! May be with sign.\n");
- while((c=getchar()) != EOF)
- {
- if((c>='0' && c<='9') ||(c=='-') || (c=='+'))
- printf("Correct entry.\n");
- else
- {
- if( (c>='a' && c<='z') || (c>='A' && c<='Z'))
- printf("Error!Replace the symbol! This is not the correct input!\n");
- }
- if((c=='.' || c==' ' || c=='\t'))
- printf("Error!Replace the symbol! This is not the correct input!\n");
- }
- return 0;
- }
Попробовал переписать. Почему все время p=-1. +123 также говорит, что неправильный...и правильный одновременно.
Листинг программы
- #include <stdio.h>
- #include<string.h>
- int main()
- {
- char mas[255];
- char len;
- int c, k=0, i, p=0;;
- printf("Enter only number! May be with sign.\n");
- gets(mas);
- while((c=getchar()) != EOF)
- {
- for(i=1; i<(strlen(mas)); i++)
- {
- if(mas[0] == '+' || mas[0] == '-')
- k=1;
- if((mas[i]>='0' && mas[i]<='9'))
- k=1;
- if( (mas[i]>='a' && mas[i]<='z') || (mas[i]>='A' && mas[i]<='Z'))
- p=-1;
- if((mas[i]=='.' || mas[i]==' ' || mas[i]=='\t'))
- p=-1;
- }
- }
- len=strlen(mas);
- printf("\nThe lenght is: %d\n", strlen(mas));
- if(p=-1)
- {
- printf("F\n");
- }
- if(k>0)
- printf("R\n");
- return 0;
- }
Решение задачи: «Определить, является ли последовательность правильной записью целого числа»
textual
Листинг программы
- #include <stdlib.h>
- #include <stdio.h>
- #include <ctype.h>
- #include <string.h>
- #include <stdbool.h>
- bool corect(const char *);
- int main(void){
- printf("Enter only number! May be with sign.\n");
- char str[BUFSIZ];
- fgets(str, BUFSIZ, stdin);
- if (str[strlen(str)-1] == '\n') str[strlen(str)-1] = '\0';
- printf("str: %s is %s\n", str, corect(str) ? "ok" : "no");
- return EXIT_SUCCESS;
- }
- bool corect(const char *str){
- if (*str == '-' || *str == '+'){
- if (*(str + 1) == '\0') return false;
- ++str;
- }
- if (*str == '0') return *++str == '\0';
- for (; *str; ++str){
- if (!isdigit(*str)) return false;
- }
- return true;
- }
Объяснение кода листинга программы
- В начале кода объявлены функции
main
иcorect
, а также переменныеstr
иBUFSIZ
. - В функции
main
выводится сообщение, призывающее пользователя вводить только числа. - В функции
main
пользователю предлагается ввести строку, которая будет храниться в переменнойstr
. - Если последний символ введенной строки является символом новой строки (
\n
), он заменяется на символ конца строки (\0
). - В функции
main
выводится сообщение, информирующее пользователя о том, правильно ли он ввел строку. - В функции
corect
проверяется, является ли первый символ строки знаком плюс или минус. - Если первый символ является знаком плюс или минус, функция проверяет, является ли следующий символ пустым.
- Если первый символ является знаком плюс или минус, он игнорируется, и функция продолжает работу со следующим символом.
- Если первый символ не является знаком плюс или минус, функция проверяет, является ли он нулем.
- Если первый символ является нулем, функция проверяет, является ли следующий символ пустым.
- Если первый символ не является нулем, функция проверяет каждый последующий символ, чтобы убедиться, что он является цифрой.
- Если все символы в строке являются цифрами, функция возвращает
true
. - Если в строке есть нецифровые символы, функция возвращает
false
. - В функции
main
вызывается функцияcorect
, чтобы проверить введенную пользователем строку. - В функции
main
выводится сообщение, отражающее результат проверки. - В функции
main
программа завершается с успехом.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д