2013-11-24 5 views
5

Возможно ли присвоить scanf определенный тип данных?C - Получение типа ввода Enum

#include <stdio.h> 
enum numberByMonth {jan=1,feb,mar,apr,may,jun,jul,aug,sep,okt,nov,dec}; 
main(){ 
printf("\n"); 
printf("Get Number By Month (type first 3 letters): "); 
enum numberByMonth stringy; 
scanf("%u",stringy); 
printf("Your month number is: %u",stringy); 
} 

Может кто-нибудь помочь мне, какой тип данных я должен отсканировать? Я установил его в% u, потому что gcc сказал мне, что это целое число без знака.

+2

Почему main() без типа? –

+2

Ваш спецификатор формата в порядке. Вам нужно передать адрес 'stringy' в' scanf'. то есть 'scanf ("% u ", & stringy)' – simonc

+0

AAAAAH спасибо simonc, я просто забыл амперсанд. Благодарю. – Mathias

ответ

2

Код, который вы написали, должен работать, но не так, как вы планировали, на самом деле перечисление производится как целое после компиляции и не остается следом в объектном файле вашего "jan, feb, mar, apr, may , июнь, июль, август, сентябрь, оКТ, ноябрь, декабрь», по этой причине ваша программа просто разбирает беззнаковое число из командной строки с зсапЕ и возвращает тот же номер после Printf .. Вы, наверное, хотел, чтобы этот

#include <stdio.h> 
#include <string.h> 
char* months[] = {"jan","feb","mar","apr","may","jun","jul","aug","sep","okt","nov","dec"}; 

int main() 
{ 
    printf("\n"); 
    printf("Get Number By Month (type first 3 letters): "); 
    char str[3]; 
    scanf("%s",str); 
    int i; 
    for(i=0; i<12; i++) 
    { 
     if(!strcmp(str,months[i])) 
     { 
      printf("Your month number is: %d",i+1); 
     } 
    } 
    return 0; 
} 

, который не использует перечисления, но это разумно, потому что перечисления используются для сохранения читаемости исходного кода без ухудшения эффективности и по этой причине обрабатываются как целые числа, а не строки, поэтому, если вы хотите, чтобы строка была синтаксической разборкой, вы должны использовать строки, потому что вы должны сравнивать пользовательский ввод с «jan», «feb» и т. д.

+0

Ну, на самом деле я сделал эту программу для проверки перечислений, но вы были правы, это не работало так, как предполагалось. – Mathias

+0

Итак, почему бы не присудить ему ответ? – Mawg

Смежные вопросы