2014-01-24 3 views
1

Я проанализировал дату и время от приемника GPS. И нужно, чтобы преобразовать их из строки в int:STM32 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

Кроме того, отсутствующие в кавычки строк размер вашего массив символов должны быть определены, чтобы провести еще один символ ЭОС (конец строки двоичный ноль).

Поскольку представление памяти было бы, например, "2014 \ 0"

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

ЭТО !!! Большое спасибо. Определение было только, например, его не определено таким образом в исходном коде. Зафиксирует мой пост за несколько секунд. – 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

@KeithThompson Спасибо. Сообщение отредактировано. – Chinna

+0

Зачем задавать размеры массивов, а не позволять компилятору понять это? 'char year [] =" 2014 ";' –

3

Suggest не пытается определить размер строки как 4 или 5.
Пусть компилятор определяет размер строки.

char year[] = "2014"; 

В этом случае компилятор сделает year с размером 5 инициализируется с '2', '0', '1', '4', '\0'.

ОП, определяющий размер как 4, привел к размеру массива с 4 символами без завершающего '\0', который не является строкой, создает проблемы с atoi(year).

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

  • Нет связанных вопросов^_^