Что не так с этим кодом? Он показывает вывод правильно, но заканчивается статусом выхода 56. что это значит?

#c

Вопрос:

 #include<stdio.h>
#include<ctype.h>
#include <stdlib.h>
int main()
{
  char n;
  int a;
  scanf("%s",amp;n);
  if(isdigit(n))
  {
    a=atoi(amp;n);
    if(a%2==0)
    {
      printf("EVEN"); 
    }
    else
    {
      printf("ODD");
    }
  }
  else
    printf("not a number");
}
 

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

Комментарии:

1. Хотя явное return не требуется main в более новых версиях C, оно было необходимо в более старой версии. Ваш компилятор не должен поддерживать более новую версию.

2. scanf("%s",amp;n); Это переполнение буфера. %s хранит строку, которая представляет собой последовательность символов, заканчивающуюся нулем. n это всего один байт, поэтому может храниться только пустая строка. Любой ввод больше этого приведет к переполнению буфера. Перейдите n к большему массиву, например char n[10];

3. использовать scanf("%c", amp;n)

4. Какова ваша ОС, платформа, компилятор, среда разработки и т. Д.? Кстати, что именно должна делать программа?

Ответ №1:

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

В более новых версиях C return 0; подразумевается a для main . Ваш компилятор, похоже, не поддерживает эту версию C.


В качестве отступления обратите внимание, что ваша программа страдает от переполнения буфера. Вы выделяете только один символ для чтения строки, который слишком мал для любого полезного ввода, так как для NUL, заканчивающего строку, требуется один символ.

Вам нужно использовать большой буфер. Даже в этом случае вам нужно будет добавить некоторую защиту от чтения больше, чем может обработать буфер.

Ответ №2:

Ваша int main() функция явно не возвращает никакого значения, вы должны вернуть значение с желаемым кодом выхода в конце вашей основной функции (или где бы вы ни хотели, если хотите выйти из-за ошибки), вам нужно:

 int main( void )
{
    // your code here...
    return EXIT_SUCCESS; // EXIT_SUCCESS => 0 (contained in stdlib.h)
}
 

вы также можете использовать эти макросы кода выхода для выхода из программы из-за ошибки

 int main( void )
{
    int *ptr = calloc( 10, sizeof( *ptr ) );
    
    if( ptr == NULL )
    {
        puts("Couldn't allocate memory");
        exit( EXIT_FAILURE ); // or return EXIT_FAILURE; since you are in main function
    }

    return EXIT_SUCCESS;
}
 

и кстати, вы используете char переменную для чтения строки, которую вы должны использовать %c , scanf так как вы читаете один символ

 scanf("%c", amp;n); 
 

Ответ №3:

У вас есть несколько ошибок. Помимо прочего, ваш код не может дать 100% точный результат из-за неправильного использования функций isdigit() и atoi (). Функция isdigit() работает с символом, а функция atoi() работает со строкой. В зависимости от ваших условий существует несколько типов реализации. Согласно правилам языка C, функция atoi( ) возвращает число-результат преобразования строки, если в начале строки есть число. Если в начале строки есть неразрядный символ, функция возвращает ноль. Если число в строке превышает максимальный или минимальный размер числа int, функция возвращает максимальное или минимальное допустимое число для типа int соответственно. Возвращаемое значение зависит от аппаратной платформы, на которой выполняется программа. Он отличается от функции atol () типом возвращаемого числа и, как следствие, максимально длинной строкой, подлежащей преобразованию. Для atoi () возвращаемое число имеет тип int , и, соответственно, разрядность составляет 16 или 32 бита, в зависимости от аппаратной платформы, на которой запущена программа. Для atol () возвращаемое число имеет тип long int , который всегда является 32-разрядным, независимо от архитектуры процессора. В соответствии с этим я предлагаю следующую реализацию вашей задачи:

 #include<ctype.h> 
#include<stdlib.h>
#include<stdio.h>

int main(void)
{
char n[10]; 
int a; 
scanf("%9s",n);
if((a=atoi(n))!=0)
{
    if(a%2==0) 
    { 
    printf("EVEN"); 
    } 
    else 
    { 
    printf("ODD"); 
    } 
} 
else 
    printf("not a number");
return 0;
}
 

Ответ №4:

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
int containsOnlyDigits(char s[100], int len)
{
    int i, flag;
    char ch;
    flag = 1;
    for (i = 0; i < len; i  )
    {
        if (s[i] >= '0' amp;amp; s[i] <= '9')
            continue;
        flag = 0;
    }
    return flag;
}
int main()
{
    char s[100];
    int len, n;
    scanf("%s", amp;s);
    len = strlen(s);
    if (containsOnlyDigits(s, len))
    {
        n = atoi(s);
        if (n % 2 == 0)
            printf("Even");
        else
            printf("Odd");
    }
    else
        printf("Not a number");
return 0;
 

Комментарии:

1. Пожалуйста, не просто предоставляйте код без каких-либо объяснений.