转换字符字符串为int,但不能将字符从字符的字符串转换为int?

问题描述 投票:1回答:2
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希望继续以与阵列的索引工作的每个号码。

c atoi
2个回答
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';
}

的关系,一个数字的文字表述是完全'0'高于该数字的数值是保证持有由C.支持每个字符集


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或类似这是不行的。

热门问题
推荐问题
最新问题