2011-02-02 42 views
0

好吧,我正在解析由'?'和'0' - '9'組成的18個字符的字符串。我想要做的是使用atoi函數將字符串的兩個字符塊轉換爲整數。我需要解析的字符在數組中。我迷失在如何實施這樣的解決方案。解析C中字符串的兩個字符輸入

char *str = "01"; 
    int n = atoi(str); 
    printf("The string %s as an integer is = %d\n",str,n); 

它給你「爲整數的字符串01 = 1」

+0

你能舉一些例子嗎?例如,你是否必須處理字符串「」?123?456?789?12345「?如果是,你打算從中提取兩個整數?哦,你的意思是「兩個字符塊」還是兩個字符的塊?如果後者然後我不一定會麻煩atoi,你可以將一對數字轉換爲一個整數'str [0] * 10 + str [1] - '0'* 11`。此外,如果「?4」是一個可能的雙字符塊,那麼atoi無法將其轉換,因此您不一定要使用它來保存任何特殊框。 – 2011-02-02 02:50:06

+0

問號成對出現這樣?? 23 ?? 130105 ?? 1223所以我想要的是第一個int是未知的,第二個int是23,第三個int是未知的,第四個int是13等等 – foo 2011-02-02 02:56:41

+0

我不明白這一點:str [0] * 10 + str [1] - '0'* 11爲什麼它是* 10然後* 11謝謝你的幫助:) – foo 2011-02-02 03:00:30

回答

1

這裏有一些可能的工作。

  1. 前進指針指向下一個數字或字符串
  2. 如果達到字符串的結尾結束,大功告成
  3. 使用strtol,保持結果。這將使指針前進到下一個非十進制或字符串的結尾。
  4. 回到步驟1.

這裏有一些來源。

#include <stdlib.h> 
#include <stdio.h> 
#define ARR_LEN 18  
int 
main(void) 
{ 
    char *str = "12?456?8??12????78"; 
    char *ptr = str; 
    int result[ARR_LEN]; 
    int i = 0; 
    int j = 0; 

    i = 0; 
    for (; ;) 
    { 
     while (*ptr == '?' && *ptr != '\0') 
      ++ptr; 
     if (*ptr == '\0') 
      break; 
     result[i++] = (int)strtol(ptr, &ptr, 10); 
    }  
    for (j = 0; j < i; ++j) 
     printf("%d ", result[j]); 
    printf("\n"); 
    return 0; 
} 
0
#define UNKNOWN_CONTROL -1   // integer to recognize unknown pairs 
#define CONSTANT_STRING_LENGTH 18 // The string length 

int i; 
char string[CONSTANT_STRING_LENGTH]; // This is your string 
int pairs[CONSTANT_STRING_LENGTH/2]; // Array to store results 

for (i=0; i<CONSTANT_STRING_LENGTH/2; i++) {  // For each pair in the string 
    if (string[i*2] == '?' || string[i*2]+1 == '?') // Is it a '??' pair? 
    pairs[i] = UNKNOWN_CONTROL;     // Store some constant (> 99) 
    else 
    pairs[i] = string[i*2] * 10 + string[i*2+1] - '0' * 11; // Compute the number and store 
} 

然後你的陣列將填入您想要的結果,如果我收到了你的問題的權利。

編輯:要理解計算位,你必須明白,ASCII字符(可打印,你存儲在字符串上的)不對應於它們的整數對應。 ASCII'0'是整數48,ASCII'1'是整數49,ASCII'2'是整數50,以及...

通過將第一個字符乘以10並添加第一個字符, ASCII值,而不是整數,所以你必須減去偏差。對一個字符進行「0」(ASCII的基本數字)的抽取(例如,ASCII'2' - ASCII'0'== 2),但是對於兩個字符,必須將其乘以11。請注意「0」* 11與「0」* 10 +「0」相同。做一些數學重新分配,你可以看到到底是在做什麼:

pairs[i] = (string[i*2] - '0') * 10 + string[i*2+1] - '0';