2011-09-03 175 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]);