2011-09-03 174 views

回答

5

在循環中使用sscanfstrtol

+0

是,BU它分裂我的數組{1,2,3,4,5,9}並繼續循環。如何結束循環? – Brdjo

+0

顯示你有什麼,所以它可以修復。 –

0

您需要stdlib.h中

//get n,maxDigits 
char** p = malloc(sizeof(char*) * n); 
int i; 
for(i=0;i<n;i++) 
p[i] = malloc(sizeof(char) * maxDigits); 

//copy your {12,23,45,9} into the string array p, or do your own manipulation to compute string array p. 

int* a = malloc(sizeof(int) * n); 
int i;   
for(i=0;i<n;i++) 
a[i] = atoi(p[i]); 
0

您可以通過以下方法計算單個數字(但不會將它們轉換成整數):

注意我用的一個int迭代循環來使其可讀。通常情況下你只遞增字符指針本身:

void PrintInts(const char Arr[]) 
{ 
    int Iter = 0; 
    while(Arr[Iter]) 
    { 
     if((Arr[Iter] >= '0') && (Arr[Iter]) <= '9') 
     { 
      printf("Arr[%d] is: %d",Iter, (Arr[Iter]-'0')); 
     } 
    } 
    return; 
} 

以上將被扣除0-9集的最低ASCII表示的ASCII數字轉換回一個int數。因此,例如,如果'0'表示爲40(不是),並且'1'表示爲41(不是),則41-40 = 1.

要獲得想要的結果,使用strtok的和的atoi:

//Assumes Numbers has enough space allocated for this 
int PrintInts(const int Numbers[] const char Arr[]) 
{ 
    char *C_Ptr = strtok(Arr," "); 
    int Iter = 0; 
    while(C_Ptr != NULL) 
    { 
     Numbers[Iter] = atoi(C_Ptr); 
     Iter++; 
     C_Ptr = strtok(NULL," "); 
    } 
    return (Iter-1); //Returns how many numbers were input 
} 
-1

什麼:

const char *string = "12 23 45 9"; 
int i, numbers[MAX_NUMBERS];   //or allocated dynamically 
char *end, *str = string; 
for(i=0; *str && i<MAX_NUMBERS; ++i) 
{ 
    numbers[i] = strtol(str, &end, 10); 
    str = end; 
}; 

雖然它也許您在數字陣列獲得尾隨0如果字符串的最後一個數字後的空白。

+0

@ down-voter而downvote是由於......? –

1

傳統但不贊成使用的方法是使用strtok()。現代替代品是strsep()。這裏有一個例子直客手冊頁strsep()

char **ap, *argv[10], *inputstring; 

for (ap = argv; (*ap = strsep(&inputstring, " \t")) != NULL;) 
    if (**ap != '\0') 
     if (++ap >= &argv[10]) 
      break; 

,打破inputstring成使用所提供的分隔符(空格,製表符),並在片迭代件。您應該可以修改上述內容,使用atoi()將每個片段轉換爲int。 strsep()的主要問題是它修改了輸入字符串,因此不是線程安全的。

如果您知道輸入的字符串會始終包含相同數量的整數的,另一種方法是使用sscanf()閱讀所有的整數一氣呵成:

char *input = "12 23 45 9"; 
int output[5]; 

sscanf(inputstring, "%d %d %d %d %d", &output[0], &output[1], &output[2], &output[3], &output[4]);