Strcmp сравнивается с идентичными строками, но не входит в цикл

#c #arduino

#c #arduino

Вопрос:

 char* timecompare(){
    char time[8];
    snprintf(time,8,"%i:i",hour(),minute());
    return time;
}

char* timefeed = "8:0";

if (strcmp(timecompare(), timefeed) == 0){
    Serial.println("hello"); 
}
  

У меня есть это в качестве моего кода, когда timecompare () и timefeed равны, это не выводит hello? У меня это проблема с указателем? Я вместо сравнения timecompare() с timefeed сравниваю timecompare () с «8: 0», тогда цикл работает… Это проблема с переменной timefeed?

Ответ №1:

Вы возвращаете переменную, выделенную стеком, time , из timecompare() . Это незаконно, поскольку выделенная стеком память допустима только в функции, в которой объявлена переменная.

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

 char* timecompare(){
    char* time = malloc(8);
    snprintf(time,8,"%i:i",hour(),minute());
    return time;
}
  

Не забудьте free() очистить память после того, как закончите с этим.

Комментарии:

1. строка malloc выдает ошибку недопустимого преобразования из void * в char*

2. и снова я могу ввести значение вместо переменной timefeed и получить правильный результат, так не является ли проблема переменной timefeed?

3. Современные компиляторы не должны этого делать. Вам нужно будет привести возвращаемое значение из malloc char* time = (char*) malloc(8);

4. @user вы не можете вернуть память из стека.

5. malloc ничего не сделал, он все еще не входит в цикл

Ответ №2:

Вы возвращаете локальную переменную time вне ее области видимости. При выходе из функции timecompare возвращаемое значение больше не является допустимым указателем.

Кроме того, удалите «02» из i , оно должно быть %i , если вы сравниваете его с 8: 0. Использование i выдаст «00».

Комментарии:

1. если я объявлю время вне всего, это решит проблему?

2. Это устранит эту проблему, но может создать другие проблемы, использование глобальных переменных не является желаемым решением.

3. итак, что было бы лучшим решением? Я попробовал вышеупомянутое решение, но оно не сработало.