#c #integer #latitude-longitude #shift #unsigned-char
#c #целое число #широта-долгота #сдвиг #unsigned-char
Вопрос:
у меня есть значение широты в строковом формате, и я хочу сохранить mmmmmm часть широты dd mm.mmmmm в 4 беззнаковых значения символа. а затем хотите выполнить некоторые операции сдвига..
мой код :
#include <iostream>
#include<string.h>
using namespace std;
int main()
{
char latitude[11]="",temp[5]; unsigned char byt[4];int deg,min;
strcpy(latitude,"1234.99999N");
strncpy(temp,latitude,2);
deg = atoi(temp);
strcpy(temp,"");
strncpy(temp,latitude 2,2);
min = atoi(temp);
strcpy(temp,"");
strncpy(temp,latitude 5,5);
int min_frac_part = atoi(temp);
cout<<"minfrac : "<<min_frac_part<<"n";
byt[3] = (min_frac_part >> 24) amp; 0xFF;
byt[2] = (min_frac_part >> 16) amp; 0xFF;
byt[1] = (min_frac_part >> 8) amp; 0xFF;
byt[0] = (min_frac_part) amp; 0xFF;
unsigned char input[2];
input[0] = (byt[1] << 2);
cout<<"input[0] is : "<<input[0]<<"n";
return 0;
}
этот ввод [0] неверен.. поэтому я не могу присвоить это значение int 4 значениям без знака char.. также эти значения byt передаются другой функции как беззнаковый символ..
Комментарии:
1. Что означает «этот ввод [0] неверен»?
2.
deg = atoi(temp);
считывает за пределы,atoi
ожидает строку с нулевым завершением, но вы никогда не завершаете ее нулемtemp
. Вы несколько раз повторяете эту ошибку в коде
Ответ №1:
-
latitude
длина должна быть 12 символов вместо 11, так какstrcpy()
также в самом конце помещается завершающий нулевой символ, который выходит за пределы массива, когда копируемая строковая константа имеет длину 11 символов. -
strncpy()
в свою очередь, не добавляет завершающий ноль в конце, если он не входит в число скопированных символов. Это приводит к неопределенному поведению, поскольку вtemp[2]
,temp[3]
иtemp[4]
может быть что угодно, включая другие числа.temp[2]
должно быть''
передatoi()
первым вызовом. -
Есть несколько мест, где присутствуют такие ошибки.