2016-11-30 6 views
1

Итак, моя цель - создать структуру и дать ей некоторые значения через входную функцию и вывести их через выходную функцию, по какой-то причине ее Выходные данные являются некоторыми скремблированными символами: -1 ░ùI & @ 0,000000C - У вас возникли проблемы с вводом/выводом моей структуры, используя 2 функции

Любая помощь?

P.S просто отметить, когда у меня были мои входы (инструкции scanf) и вывод (printf statements) в функции scan_element, он работал нормально. но когда я разделил его между двумя функциями, он разместил скремблированные символы выше.

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

/* run this program using the console pauser or add your own getch, system("pause") or input loop */ 

struct element_t { 
     int number; 
     char name[20]; 
     char symbol[3]; 
     char type[20]; 
     float atomic_weight; 
     char shells[6]; 
    }; 

void scan_element(struct element_t pl); 
void print_element(struct element_t pl); 

int main(int argc, char *argv[]) 
{ 
    struct element_t pl; 
    scan_element(pl); 
    print_element(pl); 
    return 0; 
} 

void scan_element(struct element_t pl) 
{ 
    printf("number:"); 
    scanf("%d",&pl.number); 

    printf("name:"); 
    scanf("%s",&pl.name); 

    printf("symbol:"); 
    scanf("%s",&pl.symbol); 

    printf("class:"); 
    scanf("%s",&pl.type); 

    printf("atomic weight:"); 
    scanf("%f",&pl.atomic_weight); 

    printf("shells use underscore for spaces :"); 
    scanf("%s",&pl.shells); 
} 

void print_element(struct element_t pl) 
{ 
    printf("%d",pl.number); 
    printf("%s",pl.name); 
    printf("%s",pl.symbol); 
    printf("%s",pl.type); 
    printf("%f",pl.atomic_weight); 
    printf("%s",pl.shells); 
} 
+2

Поиск ваших аргументов по * адресу * в ваших материалах. Ваш 'scan_element' не изменяет' p1' в main; это только изменение локальной переменной. Это невероятно распространенный вопрос для людей, которые просто изучают C, но, к сожалению, охота на дубликат является нетривиальной, так как вопросы настолько расходятся в содержании, что трудно связать их. Извини за это. – WhozCraig

+0

Вам нужно передать указатель на переменную «pl», определенную в основном в двух функциях scan_element и print-element. Поэтому переопределите такие функции, как scan_element (struct element_t * pl) и получите доступ к полю типа pl-> name. – shamba

+0

@WeatherVane no prob, –

ответ

2

вопрос вы передаете переменную структуру для scan_element(). Когда вы переходите по значению, он фактически создает копию pl в основном и дает scan_element(). Параметры, которые вы читаете в этой функции, будут записаны в скопированную структурную переменную. Таким образом, pl в main() остаются неинициализированными.

Решения Вам необходимо передать адрес переменной pl в основном для scan_element(). Вы должны изменить scan_element(), чтобы принять адрес, как показано ниже.

void scan_element(struct element_t *pl) 
{ 
    printf("number: "); 
    scanf("%d", &pl->number); 

    printf("name: "); 
    scanf("%s", pl->name); //Array name itself points to array. So you don't have to write '&'. 

    printf("symbol: "); 
    scanf("%s", pl->symbol); 

    printf("class: "); 
    scanf("%s", pl->type); 

    printf("atomic weight: "); 
    scanf("%f", &pl->atomic_weight); 

    printf("shells use underscore for spaces: "); 
    scanf("%s", pl->shells); 
} 

И изменить основной() адрес для перехода.

int main(int argc, char *argv[]) 
{ 
    struct element_t pl; 

    scan_element(&pl); 
    print_element(pl); 

    return 0; 
} 

В print_element() изменений не требуется.

+1

Хотя изменение print_element для использования указателя не * обязательно *, я бы все же подумал, что было бы более идиоматично это делать. Это делает всю программу более последовательной, а также позволяет избежать копирования структуры перед ее печатью, что может быть немного более эффективным. – hugomg

+0

@ Ventus Я согласен с hugomg. Вы должны сделать аналогичные изменения для print_element(). Надеюсь, вы сами это сделаете. – MayurK

0

Похоже, вы пытаетесь разыменования указателя, где вы не должны быть при печати из ваших строк в scan_element(). Кроме того, scan_element() передается структурной переменной вместо ссылки указателя на эту переменную. Когда вы проходите по значению, C создает копию структуры (в этом случае pl), поэтому вы редактируете новую структуру вместо оригинальной, которую вы хотите редактировать.

Это решение должно работать для вас:

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

/* run this program using the console pauser or add your own getch, system("pause") or input loop */ 

struct element_t 
{ 
    int number; 
    char name[20]; 
    char symbol[3]; 
    char type[20]; 
    float atomic_weight; 
    char shells[6]; 
}; 

void scan_element(struct element_t *pl); // now accepts a pointer (*) 
void print_element(struct element_t pl); 

int main(int argc, char *argv[]) 
{ 
    struct element_t pl; 

    scan_element(&pl); // derefrence 
    print_element(pl); 

    return 0; 
} 

void scan_element(struct element_t *pl) // now accepts a pointer (*) 
{ 
    printf("number: "); 
    scanf("%d", &pl.number); 

    printf("name: "); 
    scanf("%s", pl.name); // removed dereference here 

    printf("symbol: "); 
    scanf("%s", pl.symbol); // removed dereference here 

    printf("class: "); 
    scanf("%s", pl.type); // removed dereference here 

    printf("atomic weight: "); 
    scanf("%f", &pl.atomic_weight); 

    printf("shells use underscore for spaces: "); 
    scanf("%s", pl.shells); // removed dereference here 
} 

void print_element(struct element_t pl) 
{ 
    printf("%d", pl.number); 
    printf("%s", pl.name); 
    printf("%s", pl.symbol); 
    printf("%s", pl.type); 
    printf("%f", pl.atomic_weight); 
    printf("%s", pl.shells); 
} 
+0

Этот код не работает, поскольку вы читаете переменную локальной структуры в scan_element(). – MayurK

+0

Спасибо, я ценю обратную связь! Я пропустил это, слишком быстро просмотрев код. Я обновил ответ. –

+0

Еще одна вещь, которую вы пропустили! Прототип функции в начале! – MayurK

0

Помимо ответа на @CodyPatterson, есть еще одна проблема. Функция scan_element() принимает структуру по значению. Его подпись

void scan_element(struct element_t pl)

Это означает, что, когда функция вызывается, и вы передаете параметр, скажем, объект x, копия объекта создается и передается функции. Затем функция принимает значение и сохраняет их в копии. Копия является локальной для функции, поэтому, когда функция возвращается, она уничтожается, и все собранные данные теряются. Исходный объект xне изменился. Результат при печати может быть значением мусора.

Чтобы исправить это, передайте объект по ссылке. Таким образом, исходный объект обрабатывается в функции, что и требуется здесь. Функция подписи должна быть

void scan_element(struct element_t &pl)