Присвоение одного значения переменной другому - PullRequest
1 голос
/ 07 июля 2011

Я знаю, что это, вероятно, будет очень упрощенно для большинства людей здесь, но я новичок в этом, поэтому, пожалуйста, не обращайте на меня внимания. Я пытаюсь присвоить значение переменной другому, используя ее имя в строке printf / scanf в программе c. Вот код:

int day, month, counter;
int sunday = 0;
int monday = 1;
int tuesday = 2;
int wednesday = 3;
int thursday = 4;
int friday = 5;
int saturday = 6;

printf("Enter how many days in the month:\n");
scanf("%i", &month);

printf("Enter what day the month starts on:\n");
scanf("%i", &day);

Это всего лишь часть этого, но я пытаюсь сделать так, чтобы, когда пользователь вводит фактическое имя дня во второй строке printf / scanf, он вызывал значение int и назначал его дням. значение. Проблема в том, что это не работает, и я не знаю почему.

Ответы [ 5 ]

2 голосов
/ 07 июля 2011

Для начала, что-то в этом роде.

 int day, month, counter;
 char *dofw[] = { "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday", NULL};
 char day_string[20];

 printf("Enter how many days in the month:\n");
 scanf("%d", &month);

 printf("Enter what day the month starts on:\n");
 scanf("%20s", day_string);

 int i;
 day = -1;
 for(i=0; dofw[i]; i++) {
   if(strcmp(day_string, dofw[i]) == 0) {
     day = i;
     break;
   } 
 }
 if(day == -1)
   printf("User Y U not give good day\n");
2 голосов
/ 07 июля 2011

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

Вы должныввести строку (массив символов с типом char* или char []) через scanf с %s, а затем проанализировать ее вручную, например,

char string[50];
scanf("%s", string);
if( strcmp(string, "monday") == 0 )
  day = 1;
else if ( strcmp(string, "tuesday") == 0 )
  day = 2;

и т. д.

1 голос
/ 07 июля 2011

Вам потребуется написать функцию или набор функций, представляющих единый интерфейс для программы, использующей ее, которая будет сканировать строку (не целое число), уже прочитанную программой, и преобразовать ее в соответствующее значение.Вы, вероятно, должны делать код без учета регистра и иметь возможность принимать действительные (уникальные) сокращения (например, Sa, Su, M, Tu, W, Th, F) и т. Д. Вы можете или не можете принять день неделичисла как альтернативы именам.Если вам нужно беспокоиться об интернационализации или I18N (S, D, L, J, Ma, Me, V для Самеди, Диманш, Лунди, Марди, Меркреди, Джуди, Вегти на французском и т. Д.), Что добавляет сложности этим функциям.(но не из-за сложности кода, использующего их).

C не обеспечивает прямой способ сделать это.Ближайший подход - это POSIX strptime(), и я не думаю, что он справляется с этим во всей полноте.

0 голосов
/ 07 июля 2011

Если вы сделаете scanf, который примет целое число со знаком (%i), вы не можете ожидать ничего большего, чем целое число.Если пользователь вводит строку (скажем, воскресенье, поэтому вы хотите, чтобы в этот день было получено значение «0»), вы должны сделать это по-другому.

Возможно, вы можете попросить пользователя вставить формат ДО ДО ввода данных(printf("Enter the format of day ('n' for name, 'd' for number:\n");и затем, по выбору пользователя, вы можете выполнить другое сканирование f: если я выбрал 'n', то вы можете перейти и найти соответствующее числовое значение.

Если я могу предложить вам улучшение вашего кода, вы должны объявить разные дни, либо с массивом, либо со структурой или перечислением.

0 голосов
/ 07 июля 2011

Используйте %d при scanf() для int типов.

% d и% i похожи, но различаются для scanf ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...