char input[5] = "12345";
printf("Convert to int valid %d", atoi(input));
printf("Convert to int invalid %d", atoi(input[1])); // program crash
是否存在将char字符串的char“切片”转换为int的解决方案? 简短说明:
用户输入的字符串的值例如:1,2 3 4,5 IAM将该字符串格式化为12345 对于每个数字,我都希望继续使用数组的索引。
答案 0 :(得分:4)
如果您的意思是“如何访问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';
}
对于C所支持的每个字符集,都必须保证数字的文本表示形式比该数字的数值高'0'
的关系。
答案 1 :(得分:2)
要正确地转换任意片,您必须复制或通过在片之后插入\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或类似版本,则此操作将无效。