2015-12-03 5 views
0

Я написал небольшой код кода, и с моей точки зрения это очень странно. Таким образом, программа считывает дату и 2015-11-30 мес. Затем мне нужно будет получить число дней недели, сравнивая с массивом значений. Вот код:scanf чтение 3 числа и 1 строка

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

typedef struct Date 
{ 
    int d, m, y; 
} date; 

int main(void) { 

    char wdays[][7] = {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"}; 
    date dt; 
    char wday[2]; 
    printf("Input date and day of week.\nFor example: 2015-11-30 Mo\n"); 
    scanf("%d-%d-%d %2c\n", &dt.y, &dt.m, &dt.d, wday); 
    printf("%d-%d-%d %s\n", dt.y, dt.m, dt.d, wday); 
    if (strcmp(wdays[0], wday) == 0) printf("Compare Ok"); 
    printf("%d\n", wday[2]); 

    return 0; 
} 

Проблема заключается в том, что WDAY [2] не пусто и сравнения со значениями из wdays терпит неудачу (I вход 2015-11-30 Мо). Не могли бы вы объяснить мне, почему это не пусто? Я объявил, что это длина двух символов, и я читаю 2 символа с помощью scanf.

Дополнительные вопросы: 1) Если я поставлю «char wday [1];» вместо «char wday [2]»; то WDAY содержит только 2 символов, но dt.d читает неправильно, и я получаю 111 (код буквы «о») вместо 30.

2) Я также пытался читать, как это

scanf("%d-%d-%d %s\n", &dt.y, &dt.m, &dt.d, wday); 

Но dt.d также читает не так, даже с «char wdays [2];»

Таким образом, я чувствую, что у меня что-то отсутствует в scanf или массивах char. Не могли бы вы помочь мне разобраться?

+0

Проверить ответ. Дайте мне знать результат – GNKeshava

ответ

0

Выполните следующие изменения:

  1. Как wday строка должна хранить 3 байта, используйте char wday[3];
  2. scanf - Переключаю %2s для wday.
  3. printf в конце - используйте %s (опционально)

Вот код:

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

typedef struct Date 
{ 
    int d, m, y; 
} date; 

int main(void) { 

    char wdays[][7] = {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"}; 
    date dt; 
    char wday[3]; 
    printf("Input date and day of week.\nFor example: 2015-11-30 Mo\n"); 
    scanf("%d-%d-%d %2s\n", &dt.y, &dt.m, &dt.d, wday); 
    printf("%d-%d-%d %2s\n", dt.y, dt.m, dt.d, wday); 
    if (strcmp(wdays[0], wday) == 0) printf("Compare Ok\n"); 
    printf("%s\n", wday); 

    return 0; 
} 
+0

Спасибо, это помогло! Но не могли бы вы объяснить, почему я хранил 3 байта? Я храню «Mo», и это 2 символа один байт каждый или мне что-то не хватает? –

+0

два символа = два байта плюс символ нуль \ 0'', так что нужно всего 3 байта @ ВикторияМартьянова – GNKeshava

1

Прочитано wday используя строку %s символ преобразования, а не %c.

scanf("%d-%d-%d %2s\n", &dt.y, &dt.m, &dt.d, wday); 
+0

В этом случае dt.d читает как ноль, а не 30, как ожидалось :( –

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