2017-01-06 2 views
1

Я начал изучать C, и я написал короткую программу, реализующую структуры. На данный момент он имеет только структуру и короткую функцию, которая должна заполнять одну из структур (несколько хранятся в массиве). Программа получает все значения (в настоящее время только для одной структуры, чтобы помочь мне увидеть, что происходит), и проблема начинается в основном вСтруктуры и строки в C

printf("%s", tablica[0].nazwa); 

Поскольку программа перестает отвечать на запросы (без ошибок и предупреждений перед).

Если я ставлю:

printf("%d", tablica[0].x); 

Это будет выводить значение я помещал, как х, так что я знаю, что есть какая-то проблема со строкой в ​​Printf (но я не могу понять, почему). Это, наверное, легко, но я просто начинающий.

#include <stdio.h> 
#include <string.h> 

struct struktura 
{ 
    char *nazwa; 
    double x, y, z; 
}; 

int wczytaj(struct struktura tab[]) 
{ 
    int i; 
    for (i = 0; i<1; i++) 
     { 
     printf("Podaj nazwe: "); 
     scanf("%s", &tab[i].nazwa); 
     printf("Podaj x: "); 
     scanf("%i", &tab[i].x); 
     printf("Podaj y: "); 
     scanf("%i", &tab[i].y); 
     printf("Podaj z: "); 
     scanf("%i", &tab[i].z); 
     }; 
    return 0; 
} 

int main(struct struktura* a) 
{ int i; 
    struct struktura tablica[6]; 
    int wyniki[6][6]; 
    wczytaj(tablica); 
    printf("%s", tablica[0].nazwa); 
} 

Извините за то, что некоторые имена на польском языке, я могу исправить это, но я надеюсь, что это не размывает программу).

+1

Поскольку 'nazwa' является символом 'char *', '& tab [i] .nazwa' является' char ** '. Поскольку вы передаете 'scanf' адрес, в который хотите его сохранить, вы просите его сохранить строку в пространстве указателя на символ. Что, если строка занимает больше места, чем указатель на символ? (Скорее всего, это так.) Где-то вам нужно выделить достаточно места для хранения строки. –

+1

Похоже, вы никогда не выделяете пространство для nazwa (определенное как char *), поэтому оно является нулевым указателем. –

+1

Для начала не связывайтесь с 'malloc', но определяйте его статически, как' char nazwa [30] ' –

ответ

1

Вы используете неправильные спецификатор формата для double типов в

scanf("%i", &tab[i].x); 
printf("%d", tablica[0].x); 

и другие. Они должны быть

scanf("%lf", &tab[i].x); 
printf("%f", tablica[0].x); 

Также эта строка ввода

scanf("%s", &tab[i].nazwa); 

должны терять & амперсанд как этот

scanf("%s", tab[i].nazwa); 

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

struct struktura 
{ 
    char nazwa[30]; 
    double x, y, z; 
}; 

У вас есть очень unsual подпись для main, которая обычно

int main(void) 

или

int main(int argc, char *argv[]) 
Смежные вопросы