ОБЪЯСНЕНИЕ
В вашем коде вы объявили два char *
указателя char *month
и char *string
и пытаетесь сохранить в них строковые значения , Вы должны понимать, что эти два - просто указатели. Все, что они могут хранить, это адреса памяти для массивов char
. Это правда, что переменная массива взаимозаменяема с указателем в C. Но объявление массива также включает атрибут size.
Когда вы объявляете массив символов как:
char str[10];
Он фактически резервирует блок размером 10 в памяти, неявно создает char *str
, и сохраняет базовый адрес вновь созданного блока в str
. Но когда вы просто объявляете char *str
, все, что он делает, это создает указатель. У него нет связанного блока памяти для массива.
Вот почему вы должны объявить массив символов некоторого размера, прежде чем сохранять в нем строки с помощью scanf()
. Или вы должны динамически распределять память с помощью calloc
или malloc
после объявления указателя char *
. Только тогда вы можете сохранить в ней строковые данные.
Я изменил ваш код для правильной работы. Теперь он производит желаемый результат. Надеюсь, это поможет.
РАБОЧИЙ КОД
#include <stdio.h>
#include <stdlib.h>
struct Date
{
int date;
char month[10];
int year;
};
int main()
{
struct Date date[1];
char string[20];
scanf("%[^\n]s",string);
sscanf(string,"%d %s %d",&date[0].date,date[0].month,&date[0].year);
printf("%d %s %d",date[0].date,date[0].month,date[0].year);
return 0;
}
РЕДАКТИРОВАТЬ
Они сами по себе являются целыми числами (как и все указатели).
Как уже упоминалось в anastaciu , указатели не эквивалентны целым числам как таковым. Вы можете перейти по ссылкам, приведенным в его комментариях для получения дополнительных знаний. Я упомянул это утверждение, чтобы утверждать разницу между указателями и объявлениями массивов.