Функция C не возвращает правильную вещь? - PullRequest
2 голосов
/ 28 декабря 2011

У меня есть функция для преобразования первых 3 букв месяца в число (январь = 1, февраль = 2 и т. Д.).

   int convertDate(char date[3])
    {
        printf("%s", date);
        if(date == 'Ian')
            return 1;
        else
        if(date == 'Feb')
            return 2;
        else
        if(date == 'Mar')
            return 3;
        else
        if(date == 'Apr')
            return 4;
        else
        if(date == 'Mai')
            return 5;
        else
        if(date == 'Iun')
            return 6;
        else
        if(date == 'Iul')
            return 7;
        else
        if(date == 'Aug')
            return 8;
        else
        if(date == 'Sep')
            return 9;
        else
        if(date == 'Oct')
            return 10;
        else
        if(date == 'Noi')
            return 11;
        else
        if(date == 'Dec')
            return 12;
        else return 0;
    }

Но в main (), когда я использую:

printf("%d", convertDate("Ian"));

возвращает 0 вместо 1. То же самое для любого другого месяца. Любое предложение?

Ответы [ 6 ]

5 голосов
/ 28 декабря 2011

Используйте strcmp() при сравнении char*.

if (date == "Sep") сравнивает базовый адрес char*.

2 голосов
/ 28 декабря 2011

Поскольку в C строковые переменные имеют тип char *, при сравнении строк, которые вы делаете, сравниваются адреса указателей. Вместо этого используйте strcmp() для сравнения строк.

Кроме того, вы можете использовать stricmp() для сравнения строк без учета регистра. Обратите внимание, что вы можете реализовать свою функцию также с помощью цикла, определяющего все двенадцать фиксированных строк в массиве (используя strncmp (), чтобы гарантировать, что мы действительно сравниваем только 3 символа)

int convertDate(char date[3])
{
    const char date_names[12][4] = { 
        "Ian", "Feb", "Mar", /* etc. */ };
    int i;

    for(i = 0; i < 12; ++i)
    {
        if (strncmp(date_names[i], date, 3) == 0)
            return i+1;
    }

    return 0;
}
1 голос
/ 28 декабря 2011

Это даже не должно компилироваться. Вы сравниваете значение char* (date) со значением int ('Ian').

Это:

'Ian'

не является строковым литералом. Это многосимвольная символьная константа, и ее значение определяется реализацией. Едва ли имеет смысл использовать его.

Я предполагаю, что код, который вы разместили, не тот код, который вы скомпилировали. Вот почему вы должны скопировать и вставить в свой вопрос тот же код, который вы указали компилятору.

Как уже говорили другие, при сравнении строк вам нужно использовать strcmp(), а не == - что означает, что вы не можете использовать оператор switch.

Вы также должны знать, что объявление параметра

char date[3]

точно соответствует

char *date

3 тихо игнорируется, и если вы позвоните dateCompare("Ianxyzfoobar"), date будет указывать на строку длиной 12.

1 голос
/ 28 декабря 2011

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

Вы должны использовать strncmp, "сравнение строк". E.g.:

#include <string.h>

тогда

if(strncmp(date, "Ian", 3) == 0)
            return 1;

Примечание, используя " вместо '. Использование ' совершенно другое и может создать многобайтовое значение int в стеке, которое вам не нужно.

1 голос
/ 28 декабря 2011

Вы не можете сравнивать массив символов с помощью оператора ==.Посмотрите на функцию strcmp .

0 голосов
/ 28 декабря 2011

Вы выполняете сравнение указателей, а не сравнение строк.Используйте strcmp().

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