在不将数组转换为字符串的情况下处理字符数组本身并不难。特别是在字符数组的长度已知或很容易找到的情况下。对于字符数组,长度必须在与数组定义相同的范围内确定,例如:
size_t len sizeof myarray/sizeof *myarray;
当然,对于您可以使用的字符串strlen
。
在已知长度的情况下,无论是字符数组还是字符串,都可以通过类似下面的short函数将字符值转换为数字:
/* convert character array to integer */
int char2int (char *array, size_t n)
{
int number = 0;
int mult = 1;
n = (int)n < 0 ? -n : n; /* quick absolute value check */
/* for each character in array */
while (n--)
{
/* if not digit or '-', check if number > 0, break or continue */
if ((array[n] < '0' || array[n] > '9') && array[n] != '-') {
if (number)
break;
else
continue;
}
if (array[n] == '-') { /* if '-' if number, negate, break */
if (number) {
number = -number;
break;
}
}
else { /* convert digit to numeric value */
number += (array[n] - '0') * mult;
mult *= 10;
}
}
return number;
}
以上只是标准的 char 到 int 的转换方法,包括一些额外的条件。要处理杂散字符,除了digits
and之外'-'
,唯一的技巧是明智地选择何时开始收集数字以及何时停止。
如果您digits
在遇到第一个时开始收集转换digit
,则在遇到第一个'-'
或时转换结束non-digit
。当对(例如file_0127.txt
)等索引感兴趣时,这使得转换更加方便。
一个简短的使用示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int char2int (char *array, size_t n);
int main (void) {
char myarray[4] = {'-','1','2','3'};
char *string = "some-goofy-string-with-123-inside";
char *fname = "file-0123.txt";
size_t mlen = sizeof myarray/sizeof *myarray;
size_t slen = strlen (string);
size_t flen = strlen (fname);
printf ("\n myarray[4] = {'-','1','2','3'};\n\n");
printf (" char2int (myarray, mlen): %d\n\n", char2int (myarray, mlen));
printf (" string = \"some-goofy-string-with-123-inside\";\n\n");
printf (" char2int (string, slen) : %d\n\n", char2int (string, slen));
printf (" fname = \"file-0123.txt\";\n\n");
printf (" char2int (fname, flen) : %d\n\n", char2int (fname, flen));
return 0;
}
注意:当遇到'-'
分隔的文件索引(或类似的)时,您可以否定结果。(例如,file-0123.txt
与file_0123.txt
第一个将返回-123
而第二个返回的位置相比123
)。
示例输出
$ ./bin/atoic_array
myarray[4] = {'-','1','2','3'};
char2int (myarray, mlen): -123
string = "some-goofy-string-with-123-inside";
char2int (string, slen) : -123
fname = "file-0123.txt";
char2int (fname, flen) : -123
注意:总是存在可能导致问题的极端情况等。这并不是为了在所有字符集等中都 100% 防弹,而是在绝大多数时间工作并提供额外的转换灵活性,而无需初始解析或转换为atoi
orstrtol
等所需的字符串。