строки и целые числа в функциях - PullRequest
0 голосов
/ 21 ноября 2018

Я новичок в C ++ и сейчас изучаю функции.У меня трудные времена, чтобы заставить этот код работать.Я использую C ++ с библиотекой <cstdio>, потому что мой учитель хочет, чтобы я использовал C ++.Лазейка должна была использовать <cstdio>, поэтому код:

#include <iostream>
#include <cstdio>

void letters(char name[], char discipline[])
{
    printf("type a name:\n\n");
    scanf("%s", &name);

    printf("\n\ntype a discipline:\n\n");
    scanf("%s", &discipline);

    printf("\n\nname: %s\n\ndiscipline: %s", name, discipline);
}

void calcsum(int point1, int point2, int sum)
{   
    printf("\n\ntype a point:\n\n");
    scanf("%i", &point1);

    printf("\n\ntype a second point:\n\n");
    scanf("%i", &point2);

    sum = point1 + point2;
    printf("\n\nsum is: %i", sum);
}

int main(int argc, char** argv)
{
    char name[100];
    char discipline[100];
    int point1, point2, sum;

    letters(name, discipline);
    calcsum(point1, point2,sum);    

    return 0;
}

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

1 Ответ

0 голосов
/ 21 ноября 2018

Лазейка должна была использовать <cstdio>

Я не уверен, что ваш учитель будет любить ваш выбор, но вы не просили об этом.

В

printf("type a name:\n\n");
scanf("%s", &name);

printf("\n\ntype a discipline:\n\n");
scanf("%s", &discipline);

name и discipline уже указатели, вам не нужно использовать оператор адреса & на них, когда они передаютсяscanf().

Кроме того, нет причин для передачи параметров вашим функциям calcsum() и letters(), поскольку вы не хотите передавать какие-либо данные.Просто определите переменные, которые они используют внутри функций:

void letters()
{
    printf("type a name:\n\n");
    char name[100];
    scanf("%99s", &name);  // read 99 characters + terminating '\0' max

    printf("\n\ntype a discipline:\n\n");
    char discipline[100];
    scanf("%99s", &discipline);  // NEVER use "%s" with scanf without specifying
                                 // a maximum width for field to read.

    printf("\n\nname: %s\n\ndiscipline: %s", name, discipline);
}

void calcsum()
{  
    printf("\n\ntype a point:\n\n");
    int point1;
    scanf("%i", &point1);

    printf("\n\ntype a second point:\n\n");
    int point2;
    scanf("%i", &point2);

    int sum = point1 + point2;    
    printf("\n\nsum is: %i", sum);

}

int main()  // there is also no need of taking parameters if you don't use them
{
    letters();  // no parameters needed since you don't
    calcsum();  // want to pass values to these functions

    // return 0;  main defaults to return 0 if there is no return-statement.
}

Последнее, но не менее важное, следует отметить, что все функции стандартной библиотеки C ++ находятся в пространстве имен std (или ниже).Это касается и унаследованных функций из стандартной библиотеки c.Так что

printf( /* ... */ );
scanf( /* ... */ );
// etc

на самом деле должно быть

std::printf( /* ... */ );
std::scanf( /* ... */ );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...