2013-09-30 4 views
0

Я пытаюсь преобразовать строку int в массив int.Нужна помощь в исправлении - ошибка atoi() output

Вот мой код:

int premaster1 = 3255859; 
char hashString[100]; 
int hashStringInput[1000]; 

sprintf(hashString,"%d%d%d",premaster1,300,350); 
printf("\n message going inside hash function = %s\n",hashString); 


for(i=0;i<strlen(hashString)+1;i++){ 
    hashStringInput[i] = atoi(&hashString[i]); 
    printf("%d",hashStringInput[i]); 
} 

вот мой выход:

message going inside hash function = 3255859300350 
274089982-18387374102472550215643330548593003505930035093003503003503503503505000 

, который, очевидно, неправильно. Мое желание должно быть:

message going inside hash function = 3255859300350 
3255859300350 

Что я делаю неправильно и как его исправить?

+0

Что касается вопроса, который вы только что удалили - надеюсь, я не отворачивал вас! Просто попробуйте и скопируйте решение своей проблемы и вернитесь с более конкретным вопросом, если у вас есть какие-либо проблемы! –

ответ

1

Вы передаете целые строки в atoi:

"3255859300350" // First loop iteration 
"255859300350" // Second loop iteration 
"55859300350" 
"5859300350" 
// And so on... 

Одним из решений является использование временного буфера в цикле:

char temp [2] = { 0, 0 }; // Second element is for NUL character 
temp[0] = hashString[i]; // Copy first char 
hashStringInput[i] = atoi(temp); 

Кроме того, не используйте +1 с вашим strlen, вы не» t хотите преобразовать символ NUL.

+0

ok Я попробовал это 'char z; z = hashString [i]; \t \t hashStringInput [i] = atoi (z); 'теперь я получаю ошибку компилятора:' предупреждение: передающий аргумент 1 из 'atoi' делает указатель из целого без литья' – sukhvir

+1

@sukhvir Он должен быть 'z [0] ', а не' z'. – user694733

+0

Это сработало .. Большое спасибо сэр .. очень благодарен – sukhvir

0

Ваш код просто не имеет смысла. Функция atoi преобразует строку в целое число. Так почему вы передаете ему отдельные персонажи?

Обновление: У вас нет большого целого. У вас есть строка цифр. Цифры представляют собой число от 0 до 9 включительно, что совсем невелико. И если бы у вас было большое целое число, вы бы никогда не звонили atoi, потому что это преобразовывало строки в число целых чисел.

Ваш код, sprintf(hashString,"%d%d%d",premaster1,300,350); создает строку десятичных цифр из трех целых чисел. То есть, я предполагаю, почему вы называете это hash String. Это не большое целое число. Не путайте номера с их текстовыми представлениями. Программисты должны держать это прямо или боль. Половина решения - это понимание проблемы.

+0

, потому что я пытаюсь скрывать число внутри hashString для отдельных элементов hashStringInput, помещая каждую цифру в отдельный элемент. – sukhvir

+0

Тогда не используйте 'atoi'.Функция 'atoi' специально предназначена для преобразования * строк * (десятичных цифр) в целые числа, а не числа, а не символы. –

+0

как еще я могу перейти к преобразованию большого intiger как 3255859300350 в элементы массива int с каждым элементом как отдельной цифрой. – sukhvir

0

atoi принимает char* и преобразует его в целое число. Однако ваше целое число больше максимального значения, которое может быть представлено int. Это вызывает неопределенное поведение (в вашем случае atoi возвращается 0x7FFFFFFF для первого int)

1

Вместо ниже заявления

hashStringInput[i] = atoi(&hashString[i]); 

Используйте это заявление

hashStringInput[i] =hashString[i]-'0'; 

Конкретно в вашем случае вы можете использовать, как описано выше и это преобразует цифру ascii в целую цифру.

Example '3' to 3. 
+0

Это блестяще просто и эффективно .. спасибо – sukhvir

+0

@sukhvir Добро пожаловать ... – Gangadhar

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