char input[5] = "12345";
printf("Convert to int valid %d", atoi(input));
printf("Convert to int invalid %d", atoi(input[1])); // program crash
是否有转换的字符“切片”的字符的字符串转换为一个int的解决方案?简短的介绍:
用户输入与例如值的字符串:1,2 3 4,5荫在格式化该字符串12345与I希望继续以与阵列的索引工作的每个号码。
如果你的意思是“如何访问字符串的char []
阵列”,你可以使用指针运算:
char input[6] = "12345";
printf("strtol(input + 1) = %d\n", strtol(input + 1, NULL, 10)); // Output = "2345";
几件事情要注意,虽然:
atoi
不应该在所有使用; strtol
是一个字符串转换为有符号整数的任务更好的功能;看到here获取更多信息。此外,单个字符转换为int
:
if(isdigit(c))
{
c -= '0';
}
的关系,一个数字的文字表述是完全'0'
高于该数字的数值是保证持有由C.支持每个字符集
要正确地转换任意切片,你必须要么进行复印或切片后插入\0
修改字符串。后者可能不是一种选择,这取决于该字符串被存储在哪里。
要进行复印,分配足够大,以容纳片和\0
的数组。如果你知道在编译时片的大小,可以分配在栈上:
char slice[2];
否则,你就必须动态地分配:
char *slice;
slice = malloc(2);
堆栈中分配片不需要被释放,但动态分配的人应尽快,因为他们不再需要释放:
free(slice);
一旦你已经切片分配,复制感兴趣的部分,并与\0
终止它:
strncpy(slice, s + 1, 1);
slice[1] = '\0';
atoi(slice);
这种技术将几乎总是工作。
如果你的片总是以字符串结束,你不需要做一个副本:你只需要一个指针传递给片的起点:
atoi(s + 1);
修改字符串本身可能不会工作,除非它是在写存储器。如果你确定是这样的话,你可以这样做:
char tmp;
tmp = s[1];
s[1] = '\0';
atoi(s);
s[1] = tmp;
如果你是肯定,但内存是不是写的,你的程序将赛格故障。
因为你的片是一个字符长的特殊情况下,你可以使用一个事实,即字符是数字:
s[0] - '0'
需要注意的是'0' !='\0'
,而且如果您的机器使用EBCDIC或类似这是不行的。