2011-04-29 114 views
0
char* timecompare(){ 
    char time[8]; 
    snprintf(time,8,"%i:%02i",hour(),minute()); 
    return time; 
} 

char* timefeed = "8:0"; 

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

當timecompare()和timefeed都相等,它不是打印你好嗎?我這是一個指針問題?我而不是比較timecompare()與timefeed我比較timecompare()與「8:0」,然後循環工作......這是一個問題與timefeed變量?Strcmp比較相同的字符串,但不進入循環

回答

3

您正在從timecompare()返回堆棧分配變量time。這是非法的,因爲堆棧分配的內存僅在聲明變量的函數中有效。

相反,你需要返回一個堆分配的字符串。你的編譯器應該警告你這一點。你可以這樣寫:

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

請記住free()內存完成後。

+0

malloc行給了我一個錯誤無效轉換從void *到char * – user541597 2011-04-29 03:05:41

+0

,再次我可以鍵入一個值而不是變量timefeed並得到正確的結果,所以是不是問題timefeed變量? – user541597 2011-04-29 03:06:56

+0

現代編譯器不應該那樣做。你必須從malloc'char * time =(char *)malloc(8);' – 2011-04-29 03:07:21

1

您將範圍外的本地變量time返回。當您退出函數timecompare時,返回的值不再是有效的指針。

此外,從%02i中刪除「02」,如果將其與8:0進行比較,它應該是%i。使用%02i將產生「00」。

+0

會解決問題嗎? – user541597 2011-04-29 03:05:18

+0

它會解決這個問題,但可能會產生其他問題,使用全局變量不是一個理想的解決方案。 – littleadv 2011-04-29 03:16:53

+0

那麼最好的解決方案是什麼?我嘗試了上述解決方案,但沒有奏效。 – user541597 2011-04-29 03:25:41