2013-05-01 67 views
1

讓我們說我們有以下數字。如何從數字中獲取一些數字?

數= 2001000200030

我怎樣才能搶到第一位,並將其存儲到一個變量?然後 抓住接下來的四位數字並將它們存儲到另一個變量? 然後接下來的四位數......

所以輸出應該是這樣的。

first = 2;

firstfour = 0010

secondfour = 0020

thirdfour = 0030

謝謝你,我很欣賞你的時間。

+6

您可以隨時將其轉換爲字符串並按字節抓取。 – 2013-05-01 22:44:42

+0

我不知道,除非我看到一個例子。 – Ammar 2013-05-01 22:45:37

+0

我添加了一個答案,演示如何做到這一點。 – 2013-05-01 22:54:06

回答

2

數字以二進制形式存儲在計算機中,因此整數不能區分個別數字。

將數字轉換爲字符串並提取您需要的部分。如果需要,您還可以將每個部分轉換回數字。 (有可能更漂亮的方法來提取部分字符串)

此代碼是爲這個人爲的例子,如果整數是未知的,此代碼不能安全地做出它的假設。

long long number = 2001000200030LL; 

// convert number to string 
char string[64]; 
sprintf(string, "%lld", number); 

// access individual digits 
string[0] (first digit) 
string[1] (second digit) 

// copy first four digits into an int 
char firstFour[5] 
memcpy(firstFour, string, 4) 
firstFour[4] = "\0"; // null terminate 
int firstFourInt = atoi(firstFour); 

// copy second four digits into an int 
char secondFour[5] 
memcpy(secondFour, string + 4, 4) 
secondFour[4] = "\0"; // null terminate 
int secondFourInt = atoi(secondFour); 
+0

「不能安全地做出它的假設」 - 我會給你一個upvote,如果你說什麼的假設是:) – 2013-05-02 00:11:05

+0

@TimothyJones哈哈,我認爲最主要的是字符串的長度大於8個字符和少於64.我認爲它應該適用於這種限制內的情況。 – 2013-05-02 00:25:55

+0

爲什麼不使用'%8d'來回避最小長度假設?另外,你的例子不會在大多數系統上編譯,因爲'2001000200030'大於'2^32'。對於額外的功勞,你可以使用'(int)log10(INT_MAX)+ 3'來確定'string'的大小(+3 = +1來使數學運作,+1來處理負號, +1空終止符) – 2013-05-02 02:04:07

2
#include <stdio.h> 
#include <string.h> 
#include <stdint.h> 

int main(void){ 
    int64_t number = 2001000200030LL; 
    char data[24]; 
    char digit[5] ={0}, *p; 
    int len, r; 
    len=sprintf(data, "%lld", number); 
    p = data; 
    r = len % 4; 
    if(r){ 
     strncpy(digit, p, r); 
     printf("%s\n", digit); 
     len -= r; 
     p += r; 
    } 
    while(len!=0){ 
     strncpy(digit, p, 4); 
     printf("%s\n", digit); 
     len -= 4; 
     p += 4; 
    } 
    return 0; 
} 
/* output 
2 
0010 
0020 
0030 
*/ 

情況下的數量的是一個字符串,並輸出到串。

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

int main(void){ 
    char number[] = "2005001000200"; 
    char mode[2]={0}; 
    char red[5]={0}; 
    char green[5]={0}; 
    char blue[5]={0}; 

    strncpy(mode , &number[0], 1); 
    strncpy(red , &number[1], 4); 
    strncpy(green, &number[5], 4); 
    strncpy(blue , &number[9], 4); 

    printf("Mode = %s\n" , mode); 
    printf("Red = %s\n" , red); 
    printf("Green = %s\n", green); 
    printf("Blue = %s\n" , blue); 
    return 0; 
} 
+0

這不會失敗嗎? strncpy「如果source長於num,則不會在目標結尾附加隱藏的空字符。因此,在這種情況下,目的地不應被視爲空終止的C字符串(因爲它會溢出)。「 – 2013-05-01 23:20:30

+0

@JustinMeiners它不會失敗。 – BLUEPIXY 2013-05-01 23:25:41

+0

@JustinMeiners如果有任何失敗,具體情況如何? – BLUEPIXY 2013-05-01 23:32:56

4

爲什麼使用字符串時,你可以堅持處理數字?您可以使用模數和除數10來分割。

#include <stdio.h> 

int main(void) { 
    long long number = 2001000200030LL; 

    /* Find power of 10 for top digit */ 
    long long currentDigit = 1LL; 
    while((currentDigit * 10LL) < number) currentDigit *= 10LL; 

    printf("First digit = %lld\n", number/currentDigit); 
    number %= currentDigit; 

    /* Read off groups of four digits */ 
    while(currentDigit >= 10000LL) 
    { 
     long long nextFour; 
     currentDigit /= 10000LL; 
     nextFour = number/currentDigit; 
     number %= currentDigit; 
     printf("Next four = %04lld\n", nextFour); 
    } 

    /* Output any remaining digits not covered by a group of four */ 
    if (currentDigit > 1LL) 
    { 
     printf("Remaining digits = "); 
     for(currentDigit /= 10LL; currentDigit > 1LL; currentDigit /= 10LL) 
     { 
      printf("%lld", (number/currentDigit) % 10LL); 
     } 
     printf("%lld\n", number % 10LL); 
    } 

    return 0; 
} 
相關問題