2012-04-05 2 views
0

Извините за запутанный вопрос, но то, что я пытаюсь сделать, это сохранить массив в переменной.Преобразование строки цифр в целое число, сохранение результата

Я хочу сохранить цифры в *value, так что вместо int value: -12118433669 это будет int value: 123456789.

ВЫВОД

123456789 
array: '123456789' int value: -1218433669 
00
array: '00' int value: -1218433669 
5 
array: 'abc5xyz' int value: -1218433669 

array: '' int value: -1218433669 
987654321 
array: '987654321' int value: -1218433669 

ИСТОЧНИК

#include <stdio.h> 

MyFNatoi(char *numArray, int *value) { 

    int i; 

    for (i = 0; i < 10; i++) { 
     if (numArray[i] > 47 && numArray[i] < 58) { 
      printf("%c", numArray[i] - 0); 
     } 
    } 

} 

int main() { 

    char numbers[5][10] = { "123456789", "00", "abc5xyz", "", "987654321" }; 
    int i, value; 

    for(i = 0; i < 5; i++) { 
     MyFNatoi(numbers[i], &value); 
     printf("\narray: '%s' int value: %d\n", numbers[i], value); 
    } 
    return 0; 

} 
+5

Вы никогда ничего не присваиваете '* value', так что вы ожидаете? –

+0

Отсюда точка этого вопроса, как сохранить эти значения в '* value'? Не голосуйте без меня. – eveo

+1

Хорошо, в этом случае: [что вы пробовали?] (Http://whathaveyoutried.com) –

ответ

0

Я предлагаю эту функцию:

void MyFNatoi(const char *str, int *value) 
{ 
    if (value == NULL) 
     return; 

    *value = 0; 

    if (str != NULL) 
    { 
     int negative = 0; 

     if (*str == '-') 
     { 
      negative = 1; 
      str++; 
     } 

     while (*str && isdigit(*str)) 
     { 
      *value = (*value * 10) + (*str++ - '0'); 
     } 

     if (negative) 
      *value *= -1; 
    } 
} 

Он обрабатывает отрицательные числа и проверяет только ведущие цифры (поэтому не делайте номер из "abc123def456", например).

+0

Ничто в исходном вопросе не говорит о необходимости обработки негативов. Его приятный штрих, но чрезмерное кодирование приводит к раздуванию кода и рискует ошибками. – abelenky

-1

Моя версия:

void MyFNatoi(char *numArray, int *value) 
{ 
    for (*value = 0; *numArray != '\0'; ++numArray) { 
     if (0x30 <= *numArray && *numArray <= 0x39) { 
      *value = 10* *value + *numArray - 0x30; 
     } 
    } 
} 
+0

Зачем использовать сравнение вместо более удобной функции 'isdigit'? Кроме того, вместо вычитания магического числа «0x30» вы могли бы вычесть «0», чтобы сделать его более очевидным. –

+0

Исходный код использовал сравнение вместо isdigit. Зачем менять исходный код? 0x30 совершенно ясен для меня и имеет больше смысла, чем буквальный литерал. Просто разные взгляды для разных людей. – abelenky

-1
#define Zero '0' 
#define Nine '9' 

void MyFNatoi(char *numArray, int *value) { 

    int i; 
    *value = 0; 
    for (i = 0; i < 10 && numArray[i] != 0; i++) { 
     if (numArray[i] >= Zero && numArray[i] <= Nine) { 
      *value = *value * 10 + (numArray[i] - Zero); 
     } 
    } 

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