Определить, является ли последовательность правильной записью целого числа - 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программа завершается с успехом.