Дополнение не работает в c

Я пытался добавить код c, но моя программа не выполняется, кодовые блоки, к сожалению, закрываются. В чем ошибка?

void main()
{
    float  a,b;

    printf("%30sAddition Of Numbers\n");
    printf("\nEnter Number 1: ");
    scanf("%f",&a);
    printf("\nEnter Number 2: ");
    scanf("%f",&b);

    printf("\nThe addition of %0.3f and %0.3f is %0.3f",a,b,(a+b));

}

Я хочу поместить результат сложения непосредственно в оператор printf с входными данными с плавающей запятой, но у меня это не работает.

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

    void main()
{
    float  a,b;

    printf("%30sAddition Of Numbers\n");
    printf("\nEnter Number 1: ");
    scanf("%f",&a);
    printf("\nEnter Number 2: ");
    scanf("%f",&b);
    a=a+b;
    printf("\nThe addition of %0.3f and %0.3f is %0.3f",a,b,a);

}

где я ошибаюсь?


person pratik watwani    schedule 18.01.2016    source источник
comment
какая у тебя ошибка?   -  person Brian Riley    schedule 18.01.2016
comment
Каким образом это не работает?   -  person Amit    schedule 18.01.2016
comment
кодовые блоки не выполняются. отображается ошибка Windows .. кодовые блоки, к сожалению, перестали работать   -  person pratik watwani    schedule 18.01.2016
comment
Единственная проблема, которую я вижу напрямую, заключается в том, что вы не включаете файлы заголовков... но может быть, вы просто исключили их из своего примера?   -  person Brian Riley    schedule 18.01.2016
comment
Я включил файлы заголовков в свою программу   -  person pratik watwani    schedule 18.01.2016
comment
Я только сейчас понял, что codeblocks — это компилятор. К сожалению, я не знаком с ним, хотя я считаю, что он должен нормально компилироваться и работать в стандартном компиляторе C, таком как GCC, за исключением проблемы со вторым тестом, отмеченной @pFFed.   -  person Brian Riley    schedule 18.01.2016
comment
@BrianRiley Codeblocks — это не компилятор, это IDE. В Windows он обычно используется с mingw (более или менее gcc). Однако иногда новички упускают различие между своей IDE и инструментами, стоящими за ней.   -  person Dmitri    schedule 18.01.2016
comment
Вы не должны использовать void main, а либо int main(void), либо int main()   -  person Claudio Cortese    schedule 18.01.2016
comment
@Dmitri - Спасибо, что прояснил это для меня :) Я никогда не слышал о Codeblocks - мое прозрение заключалось в том, что он говорил о программном обеспечении. Не проводя дополнительных исследований, я должен был оставить это, а не говорить компилятор ;-)   -  person Brian Riley    schedule 18.01.2016
comment
@pratikwatwani - Вот хорошее объяснение того, как форматировать вывод, включая начальные пробелы перед числовым выводом.   -  person ryyker    schedule 18.01.2016
comment
а=а+б; printf(\nСложение %0.3f и %0.3f равно %0.3f,a,b,a); Вам нужна другая переменная c, чтобы c=a+b; printf(\nСложение %0.3f и %0.3f равно %0.3f,a,b,c);   -  person Bing Bang    schedule 19.01.2016
comment
Code::Blocks перестает работать и закрывается? Не ваша программа? Этого не должно происходить, даже если ваша программа дает сбой.   -  person user253751    schedule 19.01.2016


Ответы (4)


Проблема в следующем утверждении

 printf("%30sAddition Of Numbers\n");

здесь строка формата, предоставленная printf(), содержит %30s (или %s в общем случае), который является спецификатором формата (спецификатором преобразования), и вы не предоставили ему никаких аргументов. Он вызывает неопределенное поведение.

Чтобы процитировать стандарт C11, глава §7.21.6.1

[...] Если для формата недостаточно аргументов, поведение не определено. [...]

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


РЕДАКТИРОВАТЬ:

Как обсуждалось в комментариях ниже, если вы хотите, чтобы перед выводом появлялись пробелы, измените

printf("\t\tAddition Of Numbers\n");  

Тем не менее,

  • void main() должно быть как минимум int main (void), чтобы соответствовать стандартам.
  • Вы должны всегда проверять возвращаемое значение scanf(), чтобы гарантировать успешное сканирование.
person Sourav Ghosh    schedule 18.01.2016
comment
Но я думал, что это используется, чтобы дать пробел. - person pratik watwani; 18.01.2016
comment
что это значит тогда? программа работает с% 30s, когда я использую все целые числа, а не числа с плавающей запятой! как мне заставить его работать с поплавками. - person pratik watwani; 18.01.2016
comment
@pratikwatwani хорошо, прочитайте связанную статью о неопределенном поведении. :) - person Sourav Ghosh; 18.01.2016
comment
@pratikwatwani Пожалуйста. Вы также можете принять ответ, который вам помог. - person Sourav Ghosh; 18.01.2016

Проблема "%30sAddition Of Numbers\n" в вашем сообщении была решена двумя хорошими ответами (на момент написания этого сообщения). Но вы задали вопрос в комментариях, на который, возможно, не был дан полный ответ:

работает с %30s, когда я использую все целые числа, а не числа с плавающей запятой! как заставить его работать с поплавками.

Общий ответ на этот вопрос:
Спецификатор формата, который вы используете в scanf(): "%f",&a может привести к нежелательным результатам при сканировании с неожиданными переводами строк, пробелами или другими пробелами. Это можно решить, изменив строку спецификатора формата, чтобы подавить эти символы. Вот предложение:

char* fmt = "%[^\n]%*c";//This generic format specifier, can be used for both integer
                        //and floating point inputs when used in conjuction
                        //with strtod() or strtol() (see below)
scanf(fmt, input);

Объяснение "%[^\n]%*c".

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

float get_float(void)
{
    char input[80];
    char **dummy={0};
    char* fmt = "%[^\n]%*c";
    printf("Enter floating point number and hit return:\n");
    scanf(fmt, input);
    return strtod(input, dummy);
}

long get_int(void)
{
    char input[80];
    char **dummy={0};
    char* fmt = "%[^\n]%*c";
    printf("Enter integer number and hit return:\n");
    scanf(fmt, input);
    return strtol(input, dummy, 10);
}

Вызывается так:

int main(void)
{
    long integer_var = get_int();
    float float_var = get_float();
    float sum = (float)integer_var + float_var;

    return 0;
}
person ryyker    schedule 18.01.2016

  1. Попробуйте добавить getch(); функция внизу перед закрытием фигурных скобок,

как это

void main()
 {
  
  float  a,b;
  printf("%30sAddition Of Numbers\n");
  printf("\nEnter Number 1: ");
  scanf("%f",&a);
  printf("\nEnter Number 2: ");
  scanf("%f",&b);
  a=a+b;
  printf("\nThe addition of %0.3f and %0.3f is %0.3f",a,b,a);
  getch();//it will hold your output screen so you can see the output 
}
person Akshay Jadhav    schedule 05.03.2021

В этой строке

printf("%30sAddition Of Numbers\n");

вы не предоставили строковый аргумент для формата %s. Это вызывает неопределенное поведение.

Если вы хотите, чтобы вывод был разнесен, вы можете попробовать небольшую модификацию

printf("%30s\n", "Addition Of Numbers");

в этом случае вы предоставляете строковый литерал, соответствующий формату %s.

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

person Weather Vane    schedule 18.01.2016
comment
хорошо. это сработало, но когда я меняю все числа с плавающей запятой на целые числа, это работает. как? что мне делать дальше? - person pratik watwani; 18.01.2016
comment
Я понятия не имею, что вы имеете в виду, пожалуйста, будьте более конкретными или задайте другой вопрос, если это новая проблема! - person Weather Vane; 18.01.2016
comment
формат %s работает, когда я изменяю все свои типы данных на целочисленные значения, но он не работает в приведенном выше случае, почему? - person pratik watwani; 18.01.2016
comment
Потому что отсутствие аргумента для %s является неопределенным поведением. Что будет дальше, когда это или когда это не имеет значения. - person Weather Vane; 18.01.2016