2014-01-24 69 views
1

我已經從GPS接收器解析了一些日期和時間。並且需要將它們從字符串轉換爲intSTM32 C:atoi轉換不是參數的字符串的一部分

char year[4] = "2014"; 
char month[2] = "01"; 
char day[2] = "24"; 
char hour[2] ="12"; 
char minute[2] = "58"; 
char second[2] = "39"; 

GPS_current_year = atoi(year); 
GPS_current_month = atoi(month); 
GPS_current_day = atoi(day); 
GPS_current_hour = atoi(hour); 
GPS_current_minute = atoi(minute); 
GPS_current_second = atoi(second); 

執行這些之後的結果是:

enter image description here

不知何故分鐘字符串的一部分轉換小時字符串時轉換。與分鐘和秒鐘相同。

這些字符串並排放置在內存中。

如果我改變定義字符串,然後秒的順序可以被添加到年等

問題:

  • 什麼可能導致這個錯誤?
  • 有什麼辦法可以避免使用atoi這個錯誤?

我知道我可以一次使用循環一個char轉換。試圖找出它爲什麼不起作用。

+2

如果這些數組應該是字符串,它們會變得很小,因爲您忘記了特殊的字符串結束符。一般來說,對於字符串,您不需要指定大小,如果您這樣做,它們必須至少比字符串的長度大一個字符。 –

回答

3

除了在你的字符數組的大小應該被定義字符串缺少引號持有一個多字符的EOS(字符串的結尾二進制零)。

由於存儲器表示將是例如, 「2014 \ 0」

char year[4+1] = "2014"; 
+0

THIS !!!萬分感謝。定義僅僅是例如,它在原始代碼中沒有這樣定義。將在幾秒鐘內修復我的帖子。 – Kosak

+1

更好:只是省略了大小,讓編譯器找出它:'char year [] =「2014」' - 或者,如果你不需要修改它,'const char * year =「2014」;' –

0

你忘了在字符串引號:

char year[4] = "2014"; 
+1

這會導致編譯時錯誤,而不是OP描述的運行時症狀。問題已更新。但'char year [4] =「2014」;'不會創建一個字符串,因爲沒有空間來終止''\ 0''。 –

0

atoi()字符串轉換爲整數。但是你給字符串變量賦予非字符串值。更改您的代碼

char year[5] = "2014"; 
char month[3] = "01"; 
char day[3] = "24"; 
char hour[3] ="12"; 
char minute[3] = "58"; 
char second[3] = "39"; 
+0

這將導致編譯時錯誤,而不是OP描述的運行時症狀。問題已更新。但'char year [4] =「2014」;'不會創建一個字符串,因爲沒有空間來終止''\ 0''。 –

+0

@凱瑟湯普森謝謝。發佈編輯。 – Chinna

+0

爲什麼要指定數組的大小,而不是讓編譯器弄清楚呢? 'char year [] =「2014」;' –

3

建議不要試圖定義字符串的大小爲4 5.
讓編譯器確定該字符串的大小。

char year[] = "2014"; 

在這種情況下,編譯器將用year的大小爲5與'2''0''1''4''\0'初始化。

OP將大小定義爲4會導致4字符數組的大小而不終止'\0',它不是字符串,會產生atoi(year)的問題。

相關問題