我是C的初学者。 我有一个这种格式的字符数组,例如“12 23 45 9”。 如何在int数组{12,23,45,9}中转换它? 提前谢谢。
答案 0 :(得分:5)
答案 1 :(得分: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;
使用提供的分隔符(空格,制表符)将输入字符串分解成碎片并迭代碎片。您应该能够修改上述内容,使用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]);
答案 2 :(得分: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]);
答案 3 :(得分:0)
您可以使用以下技术计算个别数字(但不会将它们转换为整数):
注意我使用int迭代循环使其可读。通常你只需增加char指针本身:
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
}
答案 4 :(得分:-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结尾。