将char字符串转换为int,但无法将char从char字符串转换为int吗?

时间:2019-02-03 04:38:47

标签: c atoi

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 对于每个数字,我都希望继续使用数组的索引。

2 个答案:

答案 0 :(得分:4)

如果您的意思是“如何访问char []数组中的子字符串”,则可以使用指针算法:

char input[6] = "12345";
printf("strtol(input + 1) = %d\n", strtol(input + 1, NULL, 10)); // Output = "2345";

不过要注意的几件事:

  1. 您的数组应为6个元素,以容纳空终止符
  2. 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或类似版本,则此操作将无效。