将 char String 转换为 int 但无法将 char 从 char 字符串转换为 int?
Convert char String to an int but not possible to convert a char from an char string to an int?
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"slice"转成int?
简短描述:
用户输入一个字符串,例如:1, 2 3 4 ,5
我将该字符串格式化为 12345
对于每个数字,我想继续使用数组的索引。
如果你的意思是"how to access a substring in the char []
array",你可以使用指针运算:
char input[6] = "12345";
printf("strtol(input + 1) = %d\n", strtol(input + 1, NULL, 10)); // Output = "2345";
不过有几点需要注意:
- 你的数组应该有 6 个元素来容纳空终止符
atoi
根本不应该使用; strtol
是一个更好的函数,用于将字符串转换为有符号整数;有关详细信息,请参阅 here。
此外,将单个字符转换为 int
:
if(isdigit(c))
{
c -= '0';
}
数字的文本表示恰好 '0'
高于该数字的数值这一关系保证适用于 C 支持的每个字符集。
要正确转换任意切片,您必须复制或修改字符串,方法是在切片后插入 [=17=]
。后者可能不是一个选项,具体取决于字符串的存储位置。
要制作副本,请分配一个足够大的数组来容纳切片和一个 [=17=]
。如果在编译时知道切片的大小,就可以在栈上分配:
char slice[2];
否则,您将不得不动态分配:
char *slice;
slice = malloc(2);
堆栈分配的切片不需要释放,但是动态分配的切片应该在不再需要时立即释放:
free(slice);
分配切片后,复制感兴趣的部分并用 [=17=]
:
终止它
strncpy(slice, s + 1, 1);
slice[1] = '[=13=]';
atoi(slice);
这项技术几乎总是有效。
如果你的切片总是以字符串结尾,你不需要复制:你只需要传递一个指向切片开始的指针:
atoi(s + 1);
修改字符串本身可能行不通,除非它在可写内存中。如果您确定是这种情况,您可以执行以下操作:
char tmp;
tmp = s[1];
s[1] = '[=15=]';
atoi(s);
s[1] = tmp;
如果您确定但内存不可写,您的程序将出现段错误。
对于切片正好是一个字符长的特殊情况,您可以使用字符是数字这一事实:
s[0] - '0'
请注意 '0' !='[=20=]'
如果您的机器使用 EBCDIC 或类似的,这将不起作用。
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"slice"转成int? 简短描述:
用户输入一个字符串,例如:1, 2 3 4 ,5 我将该字符串格式化为 12345 对于每个数字,我想继续使用数组的索引。
如果你的意思是"how to access a substring in the char []
array",你可以使用指针运算:
char input[6] = "12345";
printf("strtol(input + 1) = %d\n", strtol(input + 1, NULL, 10)); // Output = "2345";
不过有几点需要注意:
- 你的数组应该有 6 个元素来容纳空终止符
atoi
根本不应该使用;strtol
是一个更好的函数,用于将字符串转换为有符号整数;有关详细信息,请参阅 here。
此外,将单个字符转换为 int
:
if(isdigit(c))
{
c -= '0';
}
数字的文本表示恰好 '0'
高于该数字的数值这一关系保证适用于 C 支持的每个字符集。
要正确转换任意切片,您必须复制或修改字符串,方法是在切片后插入 [=17=]
。后者可能不是一个选项,具体取决于字符串的存储位置。
要制作副本,请分配一个足够大的数组来容纳切片和一个 [=17=]
。如果在编译时知道切片的大小,就可以在栈上分配:
char slice[2];
否则,您将不得不动态分配:
char *slice;
slice = malloc(2);
堆栈分配的切片不需要释放,但是动态分配的切片应该在不再需要时立即释放:
free(slice);
分配切片后,复制感兴趣的部分并用 [=17=]
:
strncpy(slice, s + 1, 1);
slice[1] = '[=13=]';
atoi(slice);
这项技术几乎总是有效。
如果你的切片总是以字符串结尾,你不需要复制:你只需要传递一个指向切片开始的指针:
atoi(s + 1);
修改字符串本身可能行不通,除非它在可写内存中。如果您确定是这种情况,您可以执行以下操作:
char tmp;
tmp = s[1];
s[1] = '[=15=]';
atoi(s);
s[1] = tmp;
如果您确定但内存不可写,您的程序将出现段错误。
对于切片正好是一个字符长的特殊情况,您可以使用字符是数字这一事实:
s[0] - '0'
请注意 '0' !='[=20=]'
如果您的机器使用 EBCDIC 或类似的,这将不起作用。