2017-02-13 3 views
0

У меня есть несколько строк формата «10.214.239», которые я хочу преобразовать в целое число. Некоторые из строк являются только тысячами и, следовательно, содержат только одну точку, но некоторые из них миллионы и, следовательно, содержат 2 точки. Есть ли простой способ решить эту проблему?Преобразование строки "10.214.239" в integer

+0

Удалить все точки и бросание к целому числу? – Matheno

+3

Удалите все точки, а затем используйте функцию ['strtol'] (http://www.cplusplus.com/reference/cstdlib/strtol/). –

+0

Возможно, я мог бы немного объяснить, как это сделать :) –

ответ

6
int i, len; 
int result=0; 

len = strlen(num); 

for(i=0; i<len; i++){ 
    if(num[i] >= '0' && num[i] <= '9') 
     result=(result*10)+(num[i]-'0') 
} 

printf("%d", result); 
+0

Лучше сделать это долго. –

+1

быстро написанный код, чтобы просто нужно было понять, что вам нужно делать. – Vineet1982

4

Вы примерно это нужно:

int main() 
{ 
    const char num[] = "12.345.66"; 
    char buffer[100]; 

    // copy string to buffer skipping dots 
    char c; 
    int j = 0; 
    for (int i = 0; c = num[i]; i++) 
    { 
    if (c != '.') 
     buffer[j++] = c; 
    } 

    // put the NUL strig terminator 
    buffer[j] = 0; 

    // convert string stripped of dots to long 
    long number = strtol(buffer, NULL, 10); 

} 

Отказ от ответственности: это проверка не ошибка, быстро написанный код, который не должен использоваться, поскольку он стоит здесь, но это только должно дать вам представление о том, что тебе необходимо сделать.

+0

Не очень изящное решение, ИМХО. –

+3

Это решение действительно имеет значение для обработки возможных отрицательных входных значений. Других решений нет. –

+0

Честно говоря, этот подход намного лучше в долгосрочной перспективе. 'strtol()' позволяет очень тщательную проверку ошибок. – RoadRunner

2

Простое решение:

int i,ans=0; 
for(i=0;num[i];i++) 
    if(num[i]!='.') ans=ans*10+num[i]-'0'; 

printf("%d",ans); 
0

Просто пройти через каждый символ, и использовать isdigit() от <ctype.h>, чтобы определить, есть ли символы номера. Что-то, как это будет работать:

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 

int main(void) { 
    const char *test = "10.214.239"; 
    const char neg = '-'; 
    long number = 0; 

    for (size_t i = 0; test[i] != '\0'; i++) { 
     if (isdigit(test[i])) { 
      number *= 10; 
      number += test[i] - '0'; 
     } 
    } 

    /* if first character is a dash, make sure the converted number is negative */ 
    if (test[0] == neg) { 
     number *= -1; 
    } 

    printf("number = %ld\n", number); 

    return 0; 
} 
0

Другой подход от всех остальных ответов до сих пор было бы использовать стандартные библиотечные функции, предназначенные для обработки манипулировать/обрабатывать строки. Например, это может быть сделано с sscanf:

#include <stdio.h> 

int main(void) { 
    const char *test = "10.214.239"; 
    int vals[3] = {0, 0, 0}; 

    const int n = sscanf(test, "%i.%i.%i", &vals[0], &vals[1], &vals[2]); 
    const int exponent = n < sizeof(vals)/sizeof(int) ? 1: 1E3; 
    long number = vals[0]*1E3*exponent + vals[1]*exponent + vals[2]); 

    printf("%ld\n", number); 

    return 0; 
} 

Или, в качестве альтернативы, вы можете использовать strtok разбить строку и atol преобразовать каждую подстроку в номер:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 


int main(void) { 
    char *test = "10.214.239"; 
    char *tok = test; 
    const int exponent = 1e3; 
    long ans = 0; 

    while ((tok = strtok(tok, ".")) != NULL) { 
    ans = ans*exponent + atol(tok); 
    tok = NULL; 
    } 

    printf("%ld\n", ans); 
    return 0; 
} 
Смежные вопросы